Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO - Zwraca pusty wynik.
Forum PHP.pl > Forum > PHP
xxdrago
Witam, zaczynam się uczyć PDO i mam mały problem:

  1. $db = $this->baza; // Polaczenie z baza danych
  2. // Sprawdzamy czy login jest dostępny
  3. $sql = $db->prepare('SELECT count(*) FROM users WHERE login = ":login"');
  4. $sql->bindValue(':login', $login, PDO::PARAM_STR);
  5. $sql->execute();
  6.  
  7. $dostepnosc_loginu = $sql->fetch();
  8.  
  9. var_dump($dostepnosc_loginu);


Nie wiem, dlaczego ale zmienna $dostepnosc_loginu zawiera 0, a w rzeczywiście w bazie jest 1. Można prosić o podpowiedź co jest źle?
stud3nt
A przypisałeś wcześniej cokolwiek do $login? Jak widzę w manualu, bindowane wartości nie są puste.
  1. $calories = 150;
  2. $colour = 'red';
  3. $sth = $dbh->prepare('SELECT name, colour, calories
  4. FROM fruit
  5. WHERE calories < :calories AND colour = :colour');
  6. $sth->bindValue(':calories', $calories, PDO::PARAM_INT);
  7. $sth->bindValue(':colour', $colour, PDO::PARAM_STR);
  8. $sth->execute();
xxdrago
Tak, zmienna $login zawiera "xxdrago", a taki rekord istnieje. Kurde, już kminie kminie i nie wiem w czym błąd...

  1. <?php
  2.  
  3. # --- Dodajemy naglowki --- #
  4. ob_start(); // Buforowanie
  5. error_reporting(E_ALL); // Raportowanie bledow
  6. session_start(); // Sesja
  7.  
  8. require_once dirname(__FILE__) . '/config.php';
  9. require_once dirname(__FILE__) . '/includes/class_register.php';
  10. require_once dirname(__FILE__) . '/includes/functions.php';
  11.  
  12.  
  13. try {
  14. $db = db_connect($type, $host, $dbname, $login, $haslo);
  15. $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  16.  
  17. $r = new register;
  18. $r->setRegister($db);
  19.  
  20.  
  21.  
  22. // Zarejestruj uzytkownika
  23. $r->rejestracja('xxdrago','email','Haslo');
  24. } catch (Exception_ $exception) {
  25. echo 'Wystąpił błąd w linii ' . $exception->getLine() . ': ' . $exception->getMessage();
  26. }
  27. ?>


Klasa:

  1. <?php
  2.  
  3. class register {
  4.  
  5. public $db; // Baza danych
  6.  
  7. public function setRegister($db) {
  8. $this->baza = $db;
  9. }
  10.  
  11. public function rejestracja($login, $email, $haslo) {
  12. $db = $this->baza; // Polaczenie z baza danych
  13. // Sprawdzamy czy login jest dostępny
  14. $sql = $db->prepare('SELECT count(*) FROM users WHERE login = ":login"');
  15. $sql->bindValue(':login', $login, PDO::PARAM_STR);
  16. $sql->execute();
  17.  
  18. $dostepnosc_loginu = $sql->rowCount();
  19.  
  20. echo $dostepnosc_loginu['count(*)'];
  21.  
  22.  
  23. if ($dostepnosc_loginu['count(*)'] == 0) {
  24.  
  25. // Sprawdzamy czy podany e-mail istnieje
  26.  
  27.  
  28. $sql = $db->prepare('SELECT count(*) FROM users WHERE email = ":email"');
  29. $sql->bindValue(':email', $email, PDO::PARAM_STR);
  30. $sql->execute();
  31. $dostepnosc_email = $sql->fetch();
  32.  
  33.  
  34.  
  35.  
  36. if ($dostepnosc_email[0] == 0) {
  37. echo 'ok';
  38. } else {
  39. throw new Exception_('Konto o podanym e-mail już istnieje!');
  40. }
  41. } else {
  42. throw new Exception_('Konto o podanym loginie już istnieje!');
  43. }
  44. }
  45.  
  46. public function logowanie() {
  47. echo 'ok login';
  48. }
  49.  
  50. }
  51.  
  52. ?>


Baza:

  1. -- phpMyAdmin SQL Dump
  2. -- version 2.8.1
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 01 Lut 2013, 17:37
  7. -- Wersja serwera: 5.0.21
  8. -- Wersja PHP: 5.1.4
  9. --
  10. -- Baza danych: `cms_v2`
  11. --
  12.  
  13. -- --------------------------------------------------------
  14.  
  15. --
  16. -- Struktura tabeli dla `users`
  17. --
  18.  
  19. CREATE TABLE `users` (
  20. `id` int(12) NOT NULL AUTO_INCREMENT,
  21. `login` varchar(32) collate utf8_polish_ci NOT NULL,
  22. `haslo` varchar(64) collate utf8_polish_ci NOT NULL,
  23. `email` varchar(128) collate utf8_polish_ci NOT NULL,
  24. `ip` varchar(32) collate utf8_polish_ci NOT NULL,
  25. `przegladarka` varchar(64) collate utf8_polish_ci NOT NULL,
  26. `prawa` varchar(1) collate utf8_polish_ci NOT NULL,
  27. PRIMARY KEY (`id`)
  28. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=3 ;
  29.  
  30. --
  31. -- Zrzut danych tabeli `users`
  32. --
  33.  
  34. INSERT INTO `users` VALUES (2, 'xxdrago', '', '', '', '', '');
Damonsson
A po co Ci " " w zapytaniu ?
xxdrago
A no faktycznie ale bez tego też nie chodzi, przyzwyczajenie... próbowałem nawet tak:

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname=cms_v2','root', '');
  3. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4.  
  5. $login = 'xxdrago';
  6.  
  7.  
  8. $sql = $pdo->prepare('SELECT count(*) FROM users WHERE login =:login');
  9. $sql->bindValue(':login', $login, PDO::PARAM_STR);
  10. $sql->execute();
  11. $dostepnosc_loginu = $sql->rowCount();
  12.  
  13. print_r($dostepnosc_loginu);
  14. ?>


Ale zwraca 0 ... kurde jakim cudem?
Damonsson
A w phpMyAdmin?
xxdrago
phpMyAdmin zwraca 1 tak jak powinno być(SS):
Damonsson
Wkleiłem .sql i na żywca Twój kod z ostatniego postu i :

Więc niemożliwe ;P
xxdrago
haha? Mogę wiedzieć jakie masz php?
Damonsson
5.3.9

haha, za to mi zwraca za każdym razem 1, nawet jak nie ma takiego loginu biggrin.gif

Wyrzuć count(*) i daj po prostu *

Wtedy powinno być ok.
sazian
nie znam się na PDO ale tam zawsze będzie jeden
  1. $sql = $pdo->prepare('SELECT count(*) FROM users WHERE login =:login');
  2. $sql->bindValue(':login', $login, PDO::PARAM_STR);
  3. $sql->execute();
  4. $dostepnosc_loginu = $sql->rowCount();

jak nazwa wskazuje rowCount pobiera liczbę pobranych wierszy a to zapytanie zawsze da w wyniku jeden rekord
xxdrago
Zastanawiam, się w czym jest problem... i nie mogę dojść...

sazian,
Tak ale zauważ , że mi zawsze zwraca 0, a jemu zawsze jeden choć nie ma rekordu...

Damonsson
"Problem" jest, że masz zawsze zwracany jakiś wynik, count 0, albo count 1, albo count 9999, ale zawsze jest to jeden wynik. Czyli RowCount pokaże zawsze 1. Nie wiem czemu u Ciebie pokazuje 0, dziwne, ale to może być jakiś błąd wersji php czy mysql.
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.