Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]PDO mysql - exec czy podpinanie?
Forum PHP.pl > Forum > Przedszkole
michat34
witam tak sie zastanawiam. znam dwa sposoby na wprowadzanie danych do tabeli w PDO.

a) exec
cool.gif podpinanie

exec to kwestia jeden linijki, a przy podpinaniu kod troche sie wydłuza. i stad moje pytanie ktorego lepiej uzywac? podpinanie chyba chorni przed sql incjetion, ale w sumie jak sie dobrze ktos zabezpieczy, filtracja danych itd. to ciezko bedzie cos wstrzyknac do naszej bazy. tak wiec kiedy lepiej uzyc podpiania niz exec (oprocz dodawania kiku pakietow na raz bo to zastosowanie znam)
memory
exec - sztywne dane
prepare - reszta

w czym problem zrobić sobie funkcje
  1. public function exec2 ($sql, $data = array())
  2. {
  3. $sth = parent::prepare($sql);
  4. $sth->execute($data);
  5. $sth->fetchAll();
  6. }
  7.  
  8. exec2 ('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?', array(150,red))
michat34
dlaczego exec sztywne dane? przeciez zapytanie typu:

$a = 'jeden';
$b = 'dwa';
$stmt=$pdo->exec("INSERT INTO tabela (zmienna1,zmienna2) VALUES ('$a','$b')");

rowniez zadziala
jaslanin
w Twoim przykładzie z exec, jeżeli te dwie zmienne masz od usera to taki kod jest podatny na SQL INJECTION

prepare - właśnie po to powstało by temu zapobiegać
bostaf
Cytat(michat34 @ 5.10.2012, 23:04:34 ) *
a) exec
b) podpinanie

To którą metodę wybrać, zależy od potrzeby, od odpowiedzi jaką chcemy uzyskać.
Różnice:
  • Funkcja exec, wg manuala, wykonuje zapytanie i zwraca liczbę wierszy. Wg manuala, dane zewnętrzne przekazywane do zapytania w funkcji exec powinny zostać odpowiednio spreparowane ("eskejpowane"). Podobna funkcja PDO - query - też wykonuje zapytanie, którego dane muszą zostać eskejpowane, ale zwraca rezultat jako obiekt PDOStatement.
  • Podpinanie. Czyli prepare i execute. Te funkcje zaprojektowane są z myślą o elastyczności i bezpieczeństwie jednocześnie. Elastyczność, bo jeden raz skonstruowane zapytanie można wywoływać dowolną ilość razy, za każdym razem zmieniając tylko dane wejściowe, be konieczności przepisywania tego samego zapytania. Bezpieczeństwo, bo dają możliwość bindowania danych zewnętrznych do zapytania, czyniąc tym samym zapytanie zupełnie odpornym na SQL Injection.
Czego użyć? Jeśli przekazujesz dane zewnętrzne (czy to z GET czy z POST czy jakiekolwiek inne) to tylko i wyłącznie prepare/execute z bindowaniem (podpinaniem). Jeśli nie przekazujesz danych zewnętrznych, to zależy co chcesz uzyskać: jeśli dane z SELECTa to PDO::query, jeśli inne to PDO::exec.
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.