Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Magic_quotes - jak one właściwie działają?
Forum PHP.pl > Forum > Przedszkole
-Tofik-
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:
  1. <?php
  2. $zmienna = new klasa("SELECT * FROM testowa;");
  3. ?>


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
  1. <?php
  2. $zmienna = "Jak’s PC"; addslashes($zmienna);
  3. ?>
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:
  1. <?php
  2. $string = "Jak's PC";
  3. addslashes ($string);
  4.  
  5. $zmienna = new klasa("INSERT INTO `baza`.`testowa` (`test`) VALUES('$string');");
  6. ?>


A w klasie (klasa.php)
  1. <?php
  2. function __construct($zapytanie) {
  3. [...]
  4.    mysql_query($zapytanie);
  5. }
  6. ?>


Więc jak ostatecznie działa ten mechanizm?
no_face
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.
-Tofik-
Cytat(no_face @ 16.09.2008, 12:19:46 ) *
[...], 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:
  1. <?php
  2. zmienna = addslashes($zmienna);
  3. ?>

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?
Pilsener
Dlatego zamiast addslashes użyj:
mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual - robi to samo, tylko trochę lepiej winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.