![]() |
![]() |
--Tofik-- |
![]()
Post
#1
|
Goście ![]() |
Czy mógłby mi ktoś wyjaśnić jak dokładnie działają magic_quotes? Sprawdzając ustawienia na localhost funkcją get_magic_quotes_gpc" title="Zobacz w manualu PHP" target="_manual, funkcja ta zwraca mi wartość 1 – informując mnie tym samym, że magic_quotes są włączone. Tyle tytułem wstępu.
Działam na dwóch plikach strona.php i klasa.php. W pliku strona.php tworzę nowy obiekt mojej klasy, wywołując go z parametrem, który jest zapytaniem do bazy danych. Przykładowo:
Klasa (konkretniej konstruktor) wysyła zapytanie. Całość działa jak najbardziej poprawnie. Ciekawi mnie jednak jak w tym momencie zachowują się magic quotes? Wiem, że teoretycznie wszystkie znaki specjalne (single/double quote, backslash czy NULL) są poprzedzone backslashem automatycznie. Efekt (wydaje mi się) ma być podobny jak przy addslashes()" title="Zobacz w manualu PHP" target="_manual. Przy akcji gdzie sprawi, że $zmienna = "Jak\'s PC"; Czy tego samego można się spodziewać po magic quotes? Czy jeżeli są włączone to powinny sprawiać, że Jak’s PC w bazie zamieni się na Jak\'s PC? Czy w ogóle (w moim przypadku) ma sens mieć na uwadze magic_quotes? Nawet jak na zmiennej robię wpierw addslashes()" title="Zobacz w manualu PHP" target="_manual to patrząc na bazę nie widzę tam tzw. podwójnego „escaping”. Zakładając, że akcje, które wykonuje wyglądają tak:
A w klasie (klasa.php)
Więc jak ostatecznie działa ten mechanizm? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 346 Pomógł: 23 Dołączył: 28.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Jezeli magic_quotes "on", to automatycznie dodaje znaki ucieczki, jezeli "off" musisz sam o to zadbac. Odpowiadajac na pytanie, stosujac addslashes informujesz sql, ze ma do czynienia ze znakiem specialnym i ze musi go potraktowac jak zwykly znak, dlatego tez dodatkowego „escapinu” nie widac, jest to tylko informacja dla bazy.
Ten post edytował no_face 16.09.2008, 12:20:43 |
|
|
--Tofik-- |
![]()
Post
#3
|
Goście ![]() |
[...], dlatego tez dodatkowego „escapinu” nie widac, jest to tylko informacja dla bazy. Pisząc o dodatkowym "escapingu" mam na myśli fakt, iż mam włączone magic_quotes (nie mam wyjścia) i dodatkowo stosuje addslashes najpierw na zmiennych. Zanim wyśle zapytanie INSERT cośtam robię addslashes na zmiennej:
czyli z "Jac's PC" otrzymuje "Jac\'s PC". Wydawało mi się, że skoro mam włączone magic_quotes to wysłanie "Jack\'s PC" do bazy powinno skutkować zapisaniem czegoś takiego "Jac\\\'s PC", a tak nie jest. W bazie po wysłaniu "Jack\'s PC" widnieje "Jack's PC" nie muszę podczas wyswietlania danych z bazy "stripslashować" czego nie rozumiem (<-- tak jakby dodanego poprzez funkcję addslashes "\" traktował jak "swojego", czyli tego, który jest dodawany przez magic_uotes i jest niewidoczny[?]) Dopiero jak przez phpmyadmin dodam wartość "Jack\'s PC" to efekt będzie taki, że dodana wartość będzie faktycznie wyglądała tak: "Jack\'s PC" i konieczne będzie "stripslashowanie" tej wartości, żeby pozbyć się "\". Stąd pytanie czy wynika to po prostu ze sposobu w jaki wysyłam zapytania? (Tworząc obiekt z parametrem zawierającym zapytanie) i w tym przypadku mogę stosować addslashes? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
Dlatego zamiast addslashes użyj:
mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual - robi to samo, tylko trochę lepiej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 00:22 |