Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pdo - bindowanie / podpinanie wartosci
Forum PHP.pl > Forum > PHP > Object-oriented programming
qbal
Witam

Jestem poczatkujacy w php5. NIe rozumie paru rzeczy odnosnie PDO. Przykladowy skrypt (specjalnie z bledem)

  1. <?php
  2. try {
  3.  
  4.  
  5. $dbh = new PDO('mysql:host=localhost;port=3305;dbname=dbname', 'user', 'pass');
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $stmt= $dbh->prepare('INSERT INTO osoba VALUES(:id,:imie,:email)');
  8.  
  9. $id='nr';
  10. $imie='aaa';
  11. $email='a@a.pl';
  12.  
  13. $stmt->bindValue(':id',$id,PDO::PARAM_INT);
  14. $stmt->bindValue(':imie',$imie,PDO::PARAM_STR);
  15. $stmt->bindValue(':email',$email,PDO::PARAM_STR);
  16. $stmt -> execute();
  17.  
  18. $stmt->closeCursor();
  19. unset($stmt);
  20.  
  21. } catch (Exception $e) {
  22. echo 'Failed: ' . $e->getMessage();
  23. }
  24. ?>

tabela w MySQL qyglada nastepujaco (typ tabeli: InnoDB)
  1. DESC osoba;
  2. +-------+-------------+------+-----+---------+----------------+
  3. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  4. +-------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | AUTO_INCREMENT |
  6. | imie | varchar(10) | YES | | NULL | |
  7. | email | varchar(15) | YES | | NULL | |
  8. +-------+-------------+------+-----+---------+----------------+


Pytania:
1.dlaczego $stmt->bindValue(':id',$id,PDO::PARAM_INT); nie odrzuca wartosci string? przeciez po to sie dodaje ten parametr (PDO::PARAM_INT)
2. Dlaczego MySQL nie odrzuca stringa dla pola id?

uzywam php 5.1.6, baza MySQL 5.0.22
marast78
id jest auto_increment więc możesz bindować co chcesz i tak nic to nie da winksmiley.jpg
PARAM_INT itp. jest to info dla zapytania jaki typ jest bindowany (podejrzewam, że chodzi tu o użycie cudzysłowa, czego wymaga zapytanie przy dodawaniu stringa)
qbal
wklejam podobny przyklad:
  1. <?php
  2. try {
  3.  
  4.  
  5. $dbh = new PDO('mysql:host=localhost;port=3305;dbname=smarty', 'kuba', 'pokemon1234');
  6. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $stmt= $dbh->prepare('INSERT INTO osoba1 VALUES(:id,:imie,:email,:nr,:cos)');
  8.  
  9. $id='nr';
  10. $imie='aaa';
  11. $email='a@a.pl';
  12. $nr='cos';
  13. $cos='cos';
  14.  
  15. $stmt->bindValue(':id',$id,PDO::PARAM_INT);
  16. $stmt->bindValue(':imie',$imie,PDO::PARAM_STR);
  17. $stmt->bindValue(':email',$email,PDO::PARAM_STR);
  18. $stmt->bindValue(':nr',$nr,PDO::PARAM_INT);
  19. $stmt->bindValue(':cos',$cos,PDO::PARAM_STR);
  20. $stmt -> execute();
  21.  $stmt->closeCursor();
  22. unset($stmt);
  23. } catch (Exception $e) {
  24. echo 'Failed: ' . $e->getMessage();
  25. }
  26. ?>

mysql:
  1. DESC osoba1;
  2. +-------+-------------+------+-----+---------+----------------+
  3. | FIELD | Type | NULL | KEY | DEFAULT | Extra |
  4. +-------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | AUTO_INCREMENT |
  6. | imie | varchar(10) | YES | | NULL | |
  7. | email | varchar(15) | YES | | NULL | |
  8. | nr | int(11) | YES | | NULL | |
  9. | cos | varchar(10) | YES | | NULL | |
  10. +-------+-------------+------+-----+---------+----------------+


wykonalem powyzszy kod i dla $nr='cos' $cos='cos' oraz dla $nr=7; $cos=7; w zadnym przypadku php nie zglosil bledy/wyjatku.
MySQL zachowal sie tak ze gdy podawalem dla $nr string wpisywal w rekord 0; a gdy do $cos podawalem liczbe do bazy wpisal liczbe

w takim razie jaki jest sens podawania parametrów PDO::PARAM_INT lub PDO::PARAM_STR ?
Chyba za nie jest to jeszcze do konca gotowe, czytalem ze PDO jest w fazie rozwoju...
marast78
no jednak się niezgodze, ze jest to do niczego zwłaszcza, gdy w php nie ma jako takiego przypisywania do zmiennej danego typu, możliwe jest rzutowanie, ale to nie jest to co naprzykład w C, tu głównie chodzi o to, aby dany typ przy wykonywaniu zapytania do bazy był prawidłowo rozpoznawany przez baze, a to , że zamiast stringu z flagą PARAM_INT zapisuje do bazy 0 świadczy tylko o tym, że to działa smile.gif jeśłi juz bardzo chcesz pilnować typów bindowanych to napisz swoją klase, która by to robiła winksmiley.jpg
qbal
po prostu myslalem ze jak juz jest taka metoda (bindValue) w ktorej sie podaje jakiego typu ma byc parametr przekazany do bazy to ta klasa wyzuci wyjatek przy wstawienia takiej danej do bazy... No coz jeszce wiele sie musze nauczyc smile.gif

Cytat
a to , że zamiast stringu z flagą PARAM_INT zapisuje do bazy 0 świadczy tylko o tym, że to działa

ale na odwrot to juz tak nie dziala... wstawiajac liczbe tam gdzie okresli sie ze to ma byc PARAM_STR, PDO wstawia do bazy wlasnie ta liczbe. Moim zdaniem PDO w tkim przypadku powinno odrzucac takie zapytania albo ewentualnie wstawiac do bazy 0, ale to jest tylko moje zdanie poczatkujacego phpowca:)
daniel1302
zacytuje wikibooks
Cytat
Podpinanie jest odporne na ataki SQL Injection. MySQL ma jasno określone, co jest danymi, a co zapytaniem i ściśle się tego trzyma. Ponadto jest także wydajniejsze, niż samodzielne spinanie wszystkiego po stronie PHP.
Zyx
Podpinanie parametrów jest realizowane przez PDO wtedy i tylko wtedy, jeśli nie obsługuje tego baza. W każdym innym wypadku pretensje, dlaczego to działa tak, a nie inaczej, należy kierować do autorów konkretnego SZBD. Ręczne określanie typu nie jest MySQL-owi do niczego potrzebne. Możliwe są wywołania odpowiednich metod bez określenia typu danych. Zresztą, gdyby się ściśle tego trzymać, nie dałoby się korzystać z większości typów, jakie oferuje konkretna baza danych, jako że w PDO stałych typowych mamy dokładnie sześć i brakuje np. typu zmiennoprzecinkowego.

Niemniej jeśli chodzi o SQL Injection, jest to prawda. Jeśli dane ładujemy poprzez podpinanie, nie musimy się w ogóle o to martwić, tak samo możemy spokojnie wyłączyć magic quotes - dane są niezależne od zapytania i jedynie błąd samej bazy danych może to zmienić. Jeśli jednak oprócz podpinania część samego zapytania sklejamy ręcznie po stronie skryptu na podst. danych z zewnątrz, wtedy tam oczywiście musimy korzystać z odpowiednich zabezpieczeń.
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.