Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> pdo - bindowanie / podpinanie wartosci
qbal
post
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
marast78
post
Post #2





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 30.11.2004

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
qbal
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
marast78
post
Post #4





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 30.11.2004

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
qbal
post
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 24.11.2006

Ostrzeżenie: (0%)
-----


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:)
Go to the top of the page
+Quote Post
daniel1302
post
Post #6





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Zyx
post
Post #7





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


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ń.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 11:35