Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Problem z PDO
Ania-678
post 17.07.2007, 23:18:31
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


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

Ten post edytował Ania-678 17.07.2007, 23:19:14
Go to the top of the page
+Quote Post
strife
post 18.07.2007, 00:27:25
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


No to podaj nam kod, to zobaczymy.


--------------------
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 00:38:51
Post #3





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


hmmm... ponad 100 różnych plików php mam wklejać...? blink.gif
Go to the top of the page
+Quote Post
strife
post 18.07.2007, 00:46:05
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


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.


--------------------
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 00:49:06
Post #5





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


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
Go to the top of the page
+Quote Post
strife
post 18.07.2007, 01:06:52
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


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


?


--------------------
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 01:20:24
Post #7





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


*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

Ten post edytował Ania-678 18.07.2007, 02:21:35
Go to the top of the page
+Quote Post
SongoQ
post 18.07.2007, 06:30:37
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


A nie slyszala Pani o bindParam, radze wszystkie zapytania tak wykonywac no wiadomo z jakich przyczyn.


--------------------
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 10:42:04
Post #9





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


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

Ten post edytował Ania-678 18.07.2007, 10:42:32
Go to the top of the page
+Quote Post
nospor
post 18.07.2007, 10:46:09
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kosmowariat
post 18.07.2007, 11:17:59
Post #11





Grupa: Zarejestrowani
Postów: 235
Pomógł: 17
Dołączył: 18.07.2007
Skąd: Białystok

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


  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
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 12:01:17
Post #12





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


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

Ten post edytował Ania-678 18.07.2007, 12:02:08
Go to the top of the page
+Quote Post
kosmowariat
post 18.07.2007, 12:38:33
Post #13





Grupa: Zarejestrowani
Postów: 235
Pomógł: 17
Dołączył: 18.07.2007
Skąd: Białystok

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


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

Ten post edytował kosmowariat 18.07.2007, 12:39:19
Go to the top of the page
+Quote Post
Ania-678
post 18.07.2007, 12:58:22
Post #14





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.06.2007

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


axesmiley.png

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

Ale po zmianie już działa
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 Wersja Lo-Fi Aktualny czas: 18.08.2025 - 20:13