Ireneusz Połeć Blog > Technologie WWW > Operacje na stringach #2 (Ciągi do przechowywania)
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.