Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pytanie o PDO
Forum PHP.pl > Forum > Bazy danych > MySQL
Mayka
Dorwałem jakąś ksiązke heliona o programowaniu i zainteresowała mnie biiblioteka PDO tylko mam problem bo niewiem dlaczego takie coś nie zwraca całej tabeli asocjacyjnej tylko jeden jej wpis ? chodzi tu kkonkretnie o funkcje dbRow ale wysyłam nawszelki wypadek całość połączenia.

  1. function dbInit(){
  2. if(isset($GLOBALS['db']))return $GLOBALS['db'];
  3. global $DBVARS;
  4. $db=new PDO('mysql:host='.$DBVARS['hostname'].';dbname='.$DBVARS['db_name'],$DBVARS['username'],$DBVARS['password']);
  5. $db->query('SET NAMES utf8');
  6. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. $db->num_queries=0;
  8. $GLOBALS['db']=$db;
  9. return $db;
  10. }
  11. function dbQuery($query){
  12. $db=dbInit();
  13. $q=$db->query($query);
  14. $db->num_queries++;
  15. return $q;
  16. }
  17. function dbRow($query) {
  18. $q = dbQuery($query);
  19. return $q->fetch(PDO::FETCH_ASSOC);
  20. }
d3ut3r
pomijając zasadność tego kodu, to fetch zwraca wiersz a fetchAll zwraca wszystkie wyniki.
Mayka
Co masz na myśli jeśli chodzi o "zasadność" ?
d3ut3r
Najważniejsza wada moim zdaniem to tak naprawdę odcinasz się zupełnie od PDO, wykorzystując twój kod nie masz na przykład możliwości skorzystania z prepared statements do tego twój kod jest podatny na sql injection więc w zasadzie nie zyskujesz nic czego byś nie miał używając mysql_*

Cały "Pikuś" polega na tym żeby operować na obiekcie PDO wówczas możesz wykorzystać wszystkie jego właściwości w sposób odpowiedni z czasem wejdzie Ci to w nawyk i pisanie:

  1.  
  2. $stmt=$db->prepare('SELECT * FROM articlesWHERE id=:id');
  3. $stmt->bindValue(':id',$_GET['id'],PDO::PARAM_INT);
  4. // itd....
  5.  


nie będzie sprawiało problemów.


wookieb
Prepared statements to funkcjonalność baz danych a nie PDO.
PDO jedynie udostępnia api do łatwego ich używania.

Prepared statements to nie jedyna zabezpieczenie przed SQL injection i wcale nie musi nim być.
Jeżeli programista umie budować zapytania bez prepared statements to jeszcze lepiej dla niego.
d3ut3r
Z dokumentacji:

Cytat
PDO will emulate prepared statements/bound parameters for drivers that do not natively support them, and can also rewrite named or question mark style parameter markers to something more appropriate, if the driver supports one style but not the other.


Więc nie jest to zwykłe API to także możliwość symulowania tej funkcjonalności w bazach bez jej obsługi. Oczywiście że to nie jedyne zabezpieczenie ale nie rozumiem w czym używanie tego miałoby być gorsze ?. Jeżeli już używamy PDO to łatwiej moim zdaniem skorzystać z bindowania parametrów.

PDO nie jest lekarstwem na całe zło i jak udowodniono nawet w postach na forum, można z niego korzystać a i tak mieć podatny na ataki system, można też z niego nie korzystać i mieć system bezpieczny. Jednak moim zdaniem nie ma sensu wracać do funkcji typu mysql_query();
wookieb
Nie mówię o powrocie do mysql_query, lecz moim zdaniem używanie PS do wszystkich zapytań jest znacznym nadużyciem. Wykorzystanie zwykłych query builderów rozwiązuje całą gamę problemów związanych z SQL injection.
Mayka
Cytat(wookieb @ 3.12.2012, 10:18:12 ) *
Nie mówię o powrocie do mysql_query, lecz moim zdaniem używanie PS do wszystkich zapytań jest znacznym nadużyciem.


Ale dlaczego ? Czy pdo tak strasznie obciąża serwer czy jak ? Bo nie rozumiem ?
nospor
Tu się chłopaki nie sprzeczają o PDO a o bindowanie zmiennych. Oboje są zgodni, że PDO należy używać, ale różnią się w kwestii bidnowania zmiennych. Czytamy ze zrozumieniem wink.gif
Mayka
Cytat(nospor @ 4.12.2012, 14:10:13 ) *
Tu się chłopaki nie sprzeczają o PDO a o bindowanie zmiennych. Oboje są zgodni, że PDO należy używać, ale różnią się w kwestii bidnowania zmiennych. Czytamy ze zrozumieniem wink.gif


No to korzystać z tego w takiej postaci czy nie ? Bo ja już nic z tego nie rozumiem...
nospor
Wszystko zależy jak zbudowałeś zapytanie. W tym kodzie nie widać.
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.