Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] PDO - jak sprawdzić ilość wierszy zwróconych przez zapytanie?
Laxus
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


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 (IMG:style_emoticons/default/wacko.gif)

Ten post edytował Laxus 5.03.2017, 20:36:12
Go to the top of the page
+Quote Post
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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);


Ten post edytował Tomplus 5.03.2017, 20:52:26
Go to the top of the page
+Quote Post
Laxus
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


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.
Go to the top of the page
+Quote Post
Tomplus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


a testowałeś ten kod który przedstawiłem poniżej cytatu z manuala?
Go to the top of the page
+Quote Post
Laxus
post
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


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.
Go to the top of the page
+Quote Post
Tomplus
post
Post #6





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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
Go to the top of the page
+Quote Post
Laxus
post
Post #7





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


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 (IMG:style_emoticons/default/ohno-smiley.gif)
Go to the top of the page
+Quote Post
Tomplus
post
Post #8





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


A jaki masz poziom error_reporting? Może błędy masz niewidoczne.
Go to the top of the page
+Quote Post
Laxus
post
Post #9





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 5.03.2017

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


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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
Tomplus
post
Post #10





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:28