Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Problem z PDO
Forum PHP.pl > Forum > PHP
Ania-678
Witam.

Mam problem związany z używaniem PDO (PHP Data Objects) a konkretnie to z użyciem rowCount() na zapytania typu SELECT, gdyż zawsze zwraca Mi wartość równą zeru...

Po chwilowych poszukiwaniach znalazłam to -> http://bugs.php.net/bug.php?id=40822 i niestety stoję w kropce bo Ja mam php 5.1.6 i nie ma możliwości przesiadki na 5.2 (serwer wirtualny, pytałam się i w najbliższym czasie update'a nie przewidują...)

I nasuwa się pytanie - czy jest JAKAŚ możliwość by działało to poprawnie na 5.1.6 ? sadsmiley02.gif

EDIT: Przeszukałam neta i nie znalazłam nigdzie rozwiązania tego problemu więc chyba zrezygnuje z PDO bo na php 5.2 nie mam co liczyć o czym już wspomniałam więc mam nieco odmienne pytanie.

Co będzie wydajniejsze, czy używanie mysql_ czy też jakaś db klasa na wywoływanie 6 do około 15 zapytań przy każdym "przejściu", zapytania raczej proste - SELECT, UPDATE, DELETE, INSERT...
i jeśli db to jaką by wybrać (prostą i szybką) bo Sama to nie bardzo cuś takiego napisze...
strife
No to podaj nam kod, to zobaczymy.
Ania-678
hmmm... ponad 100 różnych plików php mam wklejać...? blink.gif
strife
Cytat(Ania-678 @ 18.07.2007, 01:38:51 ) *
hmmm... ponad 100 różnych plików php mam wklejać...? blink.gif


A jak myślisz? snitch.gif

Zrób u siebie prosty kod, w którym ewidentnie nie działa Ci ta metoda, to zobaczymy co da się zrobić. Czy aby napewno w tym wypadku winę ponosi wersja php. Dobrze by było jakbyś zobaczyła to również na localhost'ście z nowszą wersją php.

Pozdrawiam.
Ania-678
Mam takowy:

  1. <?php
  2.  
  3.  try
  4.  {
  5. $dbh = new PDO ('mysql:host=HOST;dbname=NAZWABAZY', 'USER', 'PASS');
  6. $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.  }
  8.  catch(PDOException $e)
  9.  {
  10. echo 'Połączenie z bazą danych nie mogło zostać utworzone!';
  11.  }
  12.  
  13. $los1 = rand(1, 666);
  14. echo "Wylosowało liczbę: $los1<br /><br />";
  15. $dbh -> exec('INSERT INTO `pdo` (`rand_numer`) VALUES('.$los1.')');
  16.  
  17. $qu = $dbh -> query('SELECT COUNT(*) FROM pdo');
  18. $que = $qu->rowCount();
  19.  
  20. echo "Ilość wpisów: $que <br /><br />";
  21. $qu -> closeCursor();
  22.  
  23. $dane = $dbh -> query('SELECT id, rand_numer FROM pdo ORDER BY `id` ASC');
  24.  
  25. while($row = $dane -> fetch())
  26. {
  27. echo $row['id'].': '.$row['rand_numer'].'<br />';
  28. }
  29. $dane -> closeCursor();
  30.  
  31. ?>


I to:

  1. <?php
  2. $qu = $dbh -> query('SELECT COUNT(*) FROM pdo');
  3. $que = $qu->rowCount();
  4. ?>


wysiada o czym wyżej wspomniałam bo php 5.1 ma BUGa na zliczanie wierszy i dopiero FIXnięty został w 5.2 dry.gif
strife
A nie możesz zamiast rowCount() wydobyć tego jako proste zapytanie, np. coś takiego:

  1. <?php
  2. // ... ciach
  3.  
  4. $qu = $dbh -> query('SELECT COUNT(*) FROM dupa');
  5. // $que = $qu->rowCount();
  6. foreach( $qu as $k ) {
  7. $count = $k[0];
  8. }
  9.  
  10. echo "Ilość wpisów: $count <br /><br />";
  11. ?>


?
Ania-678
*gleba*

Działa smile.gif

Problemów ciąg dalszy, mam taki fragment:

  1. <?php
  2. $pass = MD5($_POST['pass']);
  3. $slog = $pdo -> $_POST['log'];
  4. $query = $pdo -> query("SELECT id, user, ban, log FROM user WHERE log=".$slog." AND pass='".$pass."'");
  5. ?>


i sprzedaje Mi errora:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND pass=COŚ' at line 1' in /home/COŚ2.php:106 Stack trace: #0 /home/COŚ2.php(106): PDO->query('SELECT id, user...') #1 /home/COŚ1.php(4): require_once('/home/...') #2 {main} thrown in /home/COŚ2.php on line 106

worriedsmiley.gif
SongoQ
A nie slyszala Pani o bindParam, radze wszystkie zapytania tak wykonywac no wiadomo z jakich przyczyn.
Ania-678
No Pani słyszała ale nie doczytała iż w select'ach też się używa w takich przypadkach... ale już wie smile.gif

Tylko znów Pani problem ma:

  1. <?php
  2. $stat = $pdo -> prepare("SELECT id, log, ip FROM usr WHERE log=:log");
  3. $stat -> bindValue(':log', $anfdf, PDO::PARAM_STR);
  4. $stat -> execute();
  5.  
  6. $afer = $stat['id'];
  7. $ctime = time();
  8. $ip = $_SERVER['REMOTE_ADDR'];
  9.  
  10. $udfr = $pdo -> exec("UPDATE usr SET lpv=:lpv, ip=:ip WHERE id=:id");
  11. $udfr -> bindValue(':lpv', $ctime, PDO::PARAM_INT);
  12. $udfr -> bindValue(':ip', $ip, PDO::PARAM_STR);
  13. $udfr -> bindValue(':id', $afer, PDO::PARAM_INT);
  14.  
  15. $udfr -> execute();
  16. $stat -> closeCursor();
  17. ?>


A mianowicie znów sprzedaje errora:

Fatal error: Cannot use object of type PDOStatement as array in /home/blablabla.php on line 26

Linijka 26 to:

  1. <?php
  2. $afer = $stat['id'];
  3. ?>


blink.gif
nospor
No chyba Pani ma po polsku napisane: "Nie mozesz uzyc obiektu PDOStatement jak tablicy".
Co tlumaczyc na chinski znaczy:
uzyj fetch() by dobrac sie do tego co zwraca select tongue.gif
kosmowariat
  1. <?php
  2. $stat = $pdo -> prepare("SELECT id, log, ip FROM usr WHERE log=:log");
  3. $stat -> bindValue(':log', $anfdf, PDO::PARAM_STR);
  4. $stat -> execute();
  5. //---------------
  6. $result = $stat->fetchAll();
  7. $afer = $result[0]['id'];
  8. //---------------
  9. ?>


tak powinno pojść biggrin.gif
Ania-678
Poszło, ale nie na długo bo... sprzedało Mi kolejnego errorca:


Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':ip, page=:page WHERE id=:id' at line 1' in /home/blablabla.php:267 Stack trace: #0 /home/blablabla.php(267): PDO->exec('UPDATE usr ...') #1 /home/blablabla.php(4): require_once('/home/blabla...') #2 {main} thrown in /home/ftp/blablabla.php on line 267

Kod:

  1. <?php
  2. $stat = $pdo -> prepare("SELECT id, log, ip FROM usr WHERE log=:log");
  3. $stat -> bindValue(':log', $anfdf, PDO::PARAM_STR);
  4. $stat -> execute();
  5.  
  6. $result = $stat->fetchAll();
  7. $afer = $result[0]['id'];
  8. // $afer = $stat['id'];
  9.  
  10. $ctime = time();
  11. $ip = $_SERVER['REMOTE_ADDR'];
  12. $title = strip_tags($title);
  13. $udfr = $pdo -> exec("UPDATE usr SET lpv=:lpv, ip=:ip, page=:page WHERE id=:id");
  14. $udfr -> bindValue(':lpv', $ctime, PDO::PARAM_INT);
  15. $udfr -> bindValue(':ip', $ip, PDO::PARAM_STR);
  16. $udfr -> bindValue(':page', $title, PDO::PARAM_STR);
  17. $udfr -> bindValue(':id', $afer, PDO::PARAM_INT);
  18.  
  19. $udfr -> execute();
  20. $stat -> closeCursor();
  21. ?>


267 to:

  1. <?php
  2. $udfr = $pdo -> exec("UPDATE usr SET lpv=:lpv, ip=:ip, page=:page WHERE id=:id");
  3. ?>


I Ja za bardzo nie widzę błędu...
kosmowariat
droga Aniu

po pierwsze : PDO-> exec

po drugie : PDO->prepare()

po niezbyt wnikliwej analizie kodu stwierdzam że to powinno wystarczyć biggrin.gif tzn zmiana funkcji. Próbujesz robić bindowanie czyli przygotowujesz zapytanie za pomocą metody PDO->prepare() . PDO->exec służy do wykonywania zapytań

  1. <?php
  2. $udfr = $pdo -> prepare("UPDATE usr SET lpv=:lpv, ip=:ip, page=:page WHERE id=:id");
  3. ?>


powinno pomóc
Ania-678
axesmiley.png

Faktycznie był tam exec zamiast prepare.....

Ale po zmianie już działa
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.