Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] PDO - jak sprawdzić ilość wierszy zwróconych przez zapytanie?
Forum PHP.pl > Forum > Przedszkole
Laxus
Czy mógłby mi ktoś wytłumaczyć dlaczego poniższy fragment kodu zawsze zwraca 0 (nawet kiedy istnieje już w bazie podany login)?
  1. if( $validate == true ) {
  2. require_once( 'connect.php' );
  3.  
  4. $pdo = new PDO( "mysql:host = $database_host; dbname = logowanie; encoding = utf8", "$database_user", "$database_password", array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ) );
  5. $pdo -> setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
  6. $query = $pdo -> prepare( "SELECT * FROM users WHERE login = ?" );
  7. try {
  8. $query -> bindValue(1, $_POST[ 'login' ]);
  9. $query -> execute();
  10. if( $query -> rowCount() > 0 ) {
  11. $validate = false;
  12. $_SESSION[ 'loginError' ] = 'Wprowadzony login jest już zajęty.';
  13. echo $query -> rowCount();
  14. } else echo $query -> rowCount();
  15. } catch( PDOException $e ) {
  16. $e -> getMessage();
  17. }
  18.  
  19. }

Od kilku dni próbuje się uporać z problemem sprawdzenia czy zapytanie zwróciło jakieś rekordy, czy nie. Choć w sieci jest pełno tematów na ten temat i tak nie udało mi się znaleźć rozwiązania. Z mysqli nie było takich problemów, a po przejściu na PDO od razu człowiek dostaje bólu głowy wacko.gif
Tomplus
Ponieważ:

Kod
PDOStatement::rowCount() returns the number of rows affected by a DELETE, INSERT, or UPDATE statement.


  1. $rows = $query->fetchAll();
  2. echo count($rows);
Laxus
Też doczytałem, że rowCount() nie działa na SELECTach.
Próbowałem użyć funkcji fetchColumn() z zapytaniem "SELECT COUNT(*) FROM users WHERE login = ?".
Także nie zadziałało.

A przykładowo w tym filmiku Wstęp do PHP #2 Logowanie i PDO ktoś użył rowCount() oraz SELECT i mu zadziałało.
Tomplus
a testowałeś ten kod który przedstawiłem poniżej cytatu z manuala?
Laxus
Nie wiem czy dobrze to zapisałem:

  1. try {
  2. $query -> bindValue(1, $_POST[ 'login' ]);
  3. $query -> execute();
  4. $rows = $query -> fetchAll();
  5. if( count( $rows ) > 0 ) {
  6. $validate = false;
  7. $_SESSION[ 'loginError' ] = 'Wprowadzony login jest już zajęty.';
  8. echo count( $rows );
  9. } else echo count( $rows );
  10. } catch( PDOException $e ) {
  11. $e -> getMessage();
  12. } }


Nadal zawsze zwraca 0.
Tomplus
Czasem błędy są gdzie indziej niż my szukamy.

Czy zapytanie $_POST['login'] wysyła poprawną wartość? Bo może wynik jest 0 ponieważ, nie ma takiego loginu w bazie
SELECT * FROM users WHERE login = ?

Zrób print_r($_POST); a potem na sztywno daj do zapytania wynik i sprawdź np. w PHPMyAdmin
Laxus
Dzięki za pomoc. Problem rozwiązany.

Funkcja rowCount() jednak działa, także w przypadku SELECT.
Problemem okazały się białe znaki wewnątrz nawiasów przy tworzeniu obiektu PDO.
Najwidoczniej ta linijka została pomijana, bo nawet błąd nie wyskakiwał.
Jak pozbyłem się zbędnych spacji wszystko śmiga.
O dziwo parę dni temu, jak pisałem ten fragment kodu, łączył się z bazą i spacje w niczym nie przeszkadzały ohno-smiley.gif
Tomplus
A jaki masz poziom error_reporting? Może błędy masz niewidoczne.
Laxus
Błędy mam widoczne. Przed chwilą robiłem literówki przy połączeniu z bazą i wywala błędy.
Wcześniej nie chciał, stąd założyłem że pomijał całą linię.

Co do tego error_reporting to nie wiem nawet co to laugh.gif

W php.ini mam tak:

CODE
; error_reporting
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT


Nie wiem czy o to chodzi.
Tomplus
Wszystkie masz wykomentowane tutaj, ale podczas rozwijania serwisu najlepiej mieć wszystkie włączone:

E_ALL, wtedy wszystkie najmniejsze błędy programowania się pokazują. Np. brak zadeklarowanych zmiennych.
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.