Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO i num_rows .
Forum PHP.pl > Forum > PHP
nekomata
Postanowiłem przenieść się z mysqli n PDO za sugestią z tego tematu i właśnie uaktualniam moje skrypty.Jednak mam takowy problem.. mam taki kodzik
  1. $avatar = $dbc->prepare('SELECT img3030 FROM avatars WHERE nick=? LIMIT 1');
  2. $avatar->execute(array($_GET['user']));
  3. if($avatar->rowCount() > 0){
  4. while($row=$avatar->fetch(PDO::FETCH_ASSOC)){
  5. echo 'znaleziono';
  6. /*header('Content-type: image/png');
  7. $img = imagecreatefromstring($row[$type]);
  8. imagepng($img);*/
  9. }
  10. }
  11. else{
  12. echo 'Nieznaleziono';
  13. /*header('Content-type: image/png');
  14. $image = imagecreatefrompng('../style/img/noavatar.png');
  15. imagepng($image);*/
  16. }
Właśnie z tym rowCount jest problem bo nie działa tak jak powinien.(albo ja go nie używam jak powinienem) , czy jest jakaś alternatywa w PDO która działałaby tak jak mysqli_num_rows?
gregory90
http://php.net/manual/en/pdostatement.rowcount.php
"If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications. "
nekomata
Mhmm czyli zostaje mi puścić while z fetchem i dodawać do zmiennej?Dla uściślenia mam na myśli coś takiego
  1. function getPDOrow($statement){
  2. $i = 0;
  3. while($row=$statement->fetch(PDO::FETCH_ASSOC)){
  4. $i++;
  5. }
  6. return $i;
  7. }
Chociaż wolałbym się obejść bez takich "hacków" , jakieś inne propozycje?

===EDIT===

A więc tak kombinowałem z powyższym pomysłem funkcji... i wychodzi na to że do sprawdzenia muszę dwa razy odpalać zapytanie do bazy , czyli aby funkcja działała muszę uzyć czegoś takiego
  1. function getPDOrow($statement,$array){
  2. $i = 0;
  3. $statement->execute($array);
  4. while($row=$statement->fetch(PDO::FETCH_ASSOC)){
  5. $i++;
  6. }
  7. return $i;
  8. }
Tylko takie coś jest trochę nieoptymalne czyż nie?
Smertius
  1. $row=$statement->fetch(PDO::FETCH_ASSOC);
  2. $rowCount=count($row);


BTW $statement->fetch(PDO::FETCH_ASSOC); zwróci Ci zawsze jeden rekord w twoim wypadku powinno być raczej $statement->fetchAll(PDO::FETCH_ASSOC)
nekomata
Mhmmm , ale tak czy siak z taką funkcją , zapytanie jest wykonywane 2 razy... ma ktoś pomysł by poradzić sobie tylko jednym zapytaniem?
Zyx
Co temat ma wspólnego z programowaniem obiektowym? PDO, w przeciwieństwie do starszych sterowników, nie buforuje listy wyników w pamięci, tylko pobiera elementy na bieżąco. I nie trzeba znać liczby zwróconych wierszy, by stwierdzić czy coś zostało pobrane...

  1. $found = false;
  2. while($row = $stmt->fetch(PDO::FETCH_ASSOC))
  3. {
  4. $found = true;
  5. // jakis kod
  6. }
  7. $stmt->closeCursor();
  8. if(!$found)
  9. {
  10. // nie znaleziono...
  11. }
Cysiaczek
Przenoszę oczko wyżej
nekomata
Dzięki za pomoc , trochę mi to rozjaśniło w głowie.. wychodzi na to że wziąłem rowCount() jakos _num_rows , a tak naprawdę to jest _affected_rows. thx.
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.