Operacje na stringach #2 (Ciągi do przechowywania)

Zapisując informację w bazie danych w postaci stringów można czasami napotkać na problem cudzysłowów (pojedynczych i podwójnych), backslasha (“\”) czy symbolu NULL. Wiąże się to z tym, że baza danych MySQL rozumie je jako sekwencję kontrolującą zamiast zwykły znak.
W celu uniknięcia wystąpienia błędu podczas zapytania do bazy należy zastosować się do reguły:

Znak Ucieczka przed błędem
"
\"
\ \\
\\ \\\\

Oczywiście przy wykorzystywaniu formularzy i sprawdzaniu każdego znaku czy nie jest ów jednym z w/w byłoby straszenie uciążliwe, dlatego programiści wymyślili funkcję addslashes(), której działanie jest następujące:

<?php $str = "Is your name O'reilly?"; echo addslashes($str); // Outputs: Is your name O\'reilly? ?>

W pliku php.ini naszego serwera znajduje się dyrektywa odpowiedzialna za automatyczne dodawanie backslashów do zmiennych pochodzących z tablic GET, POST i cookie (magic_quotes_gpc). Jeżeli nie mamy dostępu do pliku php.ini można sprawdzić czy dyrektywa jest włączona wyświetlając echem funkcję get_magic_quotes_gpc(). Gdy wartość jej jest równa 1, to backslashy są dodawanie automatycznie do w/w tablic.

Pozostaje pytanie – co się stanie gdy mamy włączone magic_quotes_gpc i użyjemy funkcji addslashes?Będzie to wyglądało następująco:

<?php $str = "Is your name O'reilly?"; echo addslashes($str); // Outputs: Is your name O\\\'reilly? ?>

W praktyce pojawią się trzy backslashe, zamiast jednego. I tutaj pojawia się dosyć interesująca rzecz. Przy wyświetlaniu tekstu do przeglądarki za ładnie nie będą wyglądać takie backslashe. Przydałoby się je usunąć. Służy do tego funkcja stripslashes():

<?php
$str = "Is your name O\'reilly?";

// Outputs: Is your name O'reilly?
echo stripslashes($str);
?>

Wszystko jest niby ładnie i pięknie, ale jest jeden problem. W momencie, gdy mamy włączoną funkcję magic_quotes_gpc() i użyjemy na danym stringu pochodzącym z POST, GET czy COOKIE funkcji addslashes to pojawią się nam 3 backslashe. W momencie gdy będziemy chcieli je usunąć funkcją stripslashes, to będzie to wyglądać następująco:

<?php
$str = "Is your name O\\\'reilly?";

// Outputs: Is your name O\'reilly?
echo stripslashes($str);
?>

W praktyce zostały usunięte 2 backslashe zamiast 3. Ponowne użycie tej samej funkcji na stringu usuwa całkowicie backslashe z niego. Warto o tym pamiętać.

Teraz pozostaje pytanie – jak wybrnąć z tej sytuacji? Można zrobić to na kilka sposobów:

1) wyłaczyć magic_quotes_gpc

2) nie używać funkcji addslashes przy właczonej magic_quotes_gpc dla tablic post, get i cookie (można łatwo zapomnieć przy innych tablicach, np. $_SERVER)

3) napisać własną funkcję do kontrolowania znaków, np.:

<?php
$string = "as'";
function escape_data($string)
{
       return (ini_get('magic_quotes_gpc')) ? trim($string) : trim(addslashes(($string));
}
$string = escape_data($string);
echo $string;
?>

Funkcja sprawdza czy jest włączona dyrektywa magic_quotes_gpc. Jeżeli tak, to usuwa białe spacje ze stringa (tylko, bo tablice post, get i cookie mają automatycznie dodane backslashe), w przeciwnym razie dodaje backslashe.

UWAGA – przy takim rozwiązaniu należy pamiętać, że tylko tablice post, get i cookie są zmieniane przez magic_quotes_gpc. Resztę tablic należy zmienić ręcznie!

Osobiście proponuję wyłaczyć magic_quotes_gpc, żeby nie mieć problemów w przyszłości.