Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] PDO - Call to a member function query() on a non-object in
Forum PHP.pl > Forum > Przedszkole
rozny
  1. <?php
  2.          public function check_user_exists() {
  3.        
  4.            $stmt = $pdo -> query( "SELECT * FROM users WHERE login = ''''.$_POST[login].''''");
  5.            $row = mysql_num_rows($stmt);
  6.            if ($row == 1) {
  7.            
  8.                echo "Istnieje już użytkownik o loginie" .'''.$_POST[login].'''. "! Wybierz inna nazwę.";
  9.            
  10.            }
  11.            
  12.            elseif ($row == 0) {
  13.            
  14.                echo "jest spoko";
  15.                            
  16.            }
  17.                    
  18.        }
  19. ?>



Jak w tytule. Wyskakuje mi error. Rozumiem, że funkcja do której się odwołuje operuje na obiektach, a to co jej podałem nie jest obiektem. Chciał bym, żeby ten kod sprawdzał, czy istnieje w bazie użytkownik i w zależności od wyniku robił jedno lub drugie. Normalnie pewnie uporał bym się z tym już dawno, ale od dzisiaj poznaję uroki PDO, i kombinuje bardziej w tą stronę. Niestety w tym przypadku z marnym skutkiem.
Ten kod jest częścią większej klasy służącej do rejestracji userów, jednak wcześniejszy kod działa bez problemu (łączenie z bazą danych i wyświetlanie zapisanych w niej danych śmiga bez problemu) dopiero tutaj się sypie.

Może ktoś pomoże rozwiązać mi ten problem, albo chociaż podrzuci jakieś wskazówki czym się zainteresować przy rozwiązywaniu tego problemu, bo puki co jest to dla mnie nie do przeskoczenia winksmiley.jpg (klasami i obiektami zainteresowałem się tak naprawdę dopiero dzisiaj winksmiley.jpg )

pozdrawiam
bliitz
masz taki błąd bo nie utworzyłeś obiekty $pdo klasy PDO czyli:

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname=produkty', 'login', 'haslo');
  3. ?>

a jeśli już używasz PDO to nie używaj mysql_num_rows tylko stosuj metody z klasy PDO.
poza tym ze względów bezpieczeństwa stosuj bindValue.
Przykładowy kod który sprawdza czy użytkownik istnieje:
  1. <?php
  2. $stmt = $pdo->prepare( 'SELECT `id`,
  3.                                      `login`
  4.                              FROM `user`
  5.                               WHERE `login` = :login
  6.                              AND `password` = sha1( :pass )'
  7.                         );
  8.   $stmt->bindValue( ':login', $login, PDO::PARAM_STR );
  9.   $stmt->bindValue( ':pass', $pass, PDO::PARAM_STR );
  10.   $stmt->execute();
  11.        
  12.   if( $stmt->fetch() ){
  13.       echo 'zalogowany';
  14.   }
  15.   else{
  16.       echo 'zly login lub haslo';
  17.   }
  18. ?>


polecam http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
rozny
Chyba nie będzie tak łatwo jak myślałem winksmiley.jpg

  1. <?php
  2.             public function check_user_exists() {
  3.            
  4.            $pdo = new PDO('mysql:host=localhost;dbname=website_content', 'mojlogin', 'mojehaslo');
  5.            $stmt = $pdo -> query( "SELECT * FROM users WHERE login = ' '''.$_POST[login].''' '");
  6.            $stmt = $pdo -> prepare( 'SELECT `id`, `login` FROM `user` WHERE `login` = :login AND `password` = :pass');
  7.              $stmt->bindValue( ':login', '''.$_POST[login].''', PDO::PARAM_STR );
  8.              $stmt->bindValue( ':pass', '''.$_POST[password].''', PDO::PARAM_STR );
  9.              $stmt->execute();
  10.      
  11.              if( $stmt->fetch() ){
  12.      
  13.                  echo 'zalogowany';
  14.      
  15.              }
  16.      
  17.              else{
  18.    
  19.                echo 'Istnieje już użytkownik o loginie'.'''.$_POST[login].'''.'! Wybierz inna nazwę.';
  20.      
  21.              }
  22.                    
  23.        }
  24. ?>


Przede wszystkim, żebym mógł cokolwiek zrobić z danymi przekazanymi postem, muszę trzymać je w takiej postaci: '\''.$_POST[login].'\'' . Inaczej dane nie są w ogóle widoczne wewnątrz klasy. Trochę to dziwne jak dla mnie, ale jeszcze nie odkryłem sztuczki na to, żeby wewnątrz klasy zamienić te "krzaki" na prostą zmienną $login.
Dalej, rozumiem że klasę dla PDO, trzeba tworzyć za każdym razem? Ja przykleiłem do początku kodu plik, w którym łączę się z bazą danych i tam już miałem zdefiniowany obiekt $pdo, ale przykleiłem to poza definicją klasy. Rozumiem, że to mi nic nie daje, bo wewnątrz klasy ta zmienna i tak nie jest widoczna (nadałem zmiennej $pdo status global, ale nic mi to nie dało)?
Przystosowałem twój kod do swoich danych, ale za każdym razem wyświetla mi "Istnieje już użytkownik o loginie...", nie ważne co wpisze w formularzu.

Sorry za takie lamerskie pytania, ale dopiero dzisiaj postanowiłem zmienić swoje durne przyzwyczajenia kodowania (masa syfu, zero klas i obiektów i takie tam co chwile powtarzane błędy winksmiley.jpg ).

Co do lektury - właśnie z tej wikiksiążki korzystam od początku dzisiaj winksmiley.jpg Inaczej chyba w ogóle bym tego nie ogarnął winksmiley.jpg
Maciekbjw
Cytat
Przede wszystkim, żebym mógł cokolwiek zrobić z danymi przekazanymi postem, muszę trzymać je w takiej postaci: '\''.$_POST[login].'\'' . Inaczej dane nie są w ogóle widoczne wewnątrz klasy. Trochę to dziwne jak dla mnie, ale jeszcze nie odkryłem sztuczki na to, żeby wewnątrz klasy zamienić te "krzaki" na prostą zmienną $login.



A nie możesz przekazać parametrów do funkcji? winksmiley.jpg Fakt, tablica $_POST jest globalną, więc jest widoczna w każdym miejscu kodu. Jednak to rozwiązanie mało elastyczne, dlatego przekaż po prostu funkcji argumenty
Np:
  1. <?php
  2. public function check($login,$password) {
  3. //zapytanie itp
  4. }
  5.  
  6. ?>


Cytat
Dalej, rozumiem że klasę dla PDO, trzeba tworzyć za każdym razem? Ja przykleiłem do początku kodu plik, w którym łączę się z bazą danych i tam już miałem zdefiniowany obiekt $pdo, ale przykleiłem to poza definicją klasy. Rozumiem, że to mi nic nie daje, bo wewnątrz klasy ta zmienna i tak nie jest widoczna (nadałem zmiennej $pdo status global, ale nic mi to nie dało)?
Przystosowałem twój kod do swoich danych, ale za każdym razem wyświetla mi "Istnieje już użytkownik o loginie...", nie ważne co wpisze w formularzu.

Nie. Poczytaj sobie o wzrocu Singleton lub Registry.
rozny
Dobra, ze zmiennymi $login itd sobie poradziłem. Niestety nadal mam problem z funkcjonowaniem samego skryptu

  1. <?
  2.        public function check_user_exists($login) {
  3.            
  4.                       $pdo = new PDO('mysql:host=localhost;dbname=website_content', 'login', 'pass');
  5.            $stmt = $pdo -> query( "SELECT id`, `login` FROM users WHERE login = ' $login '");
  6.            $stmt = $pdo -> prepare( 'SELECT `id`, `login` FROM `users` WHERE `login` = :login');
  7.              $stmt->bindValue( ':login', '$login', PDO::PARAM_STR );
  8.              $stmt->execute();
  9.      
  10.              if( $stmt -> fetch() ){
  11.      
  12.                  echo 'Zalogowany jako:&nbsp;';
  13.      
  14.              }
  15.      
  16.              else{
  17.    
  18.                echo 'Istnieje już użytkownik o loginie'.$login.'! Wybierz inna nazwę.';
  19.      
  20.              }
  21.                    
  22.        }
  23. ?>


No i wszystko fajnie, tylko co bym nie wpisał w polu login wyskakuje mi, ze istnieje już taki użytkownik. Nie ważne co wklepie w formularz.
Jak zmienię zapytanie na
  1. <?php
  2. $stmt = $pdo -> query( "SELECT login FROM users WHERE login = ' $login '");
  3. ?>

takie jak było w pierwszej wersji skryptu, nie ma żadnej różnicy. Macie jakiś pomysł dlaczemu to nie działa? winksmiley.jpg

Co do singletona - poczytałem trochę i widzę, że jak ze wszystkim toczy się walka zwolenników i przeciwników tego rozwiązania. Ja natomiast dalej nie mam pojęcia jak tego cholerstwa użyć i jak do niego dokleić moje dane dla połączenia winksmiley.jpg Bo rozumiem, że to o to chodzi:

  1. <?php
  2. class Singleton
  3. {
  4.   private static $instance;
  5.   private function __construct() {} // Blokujemy domyślny konstruktor publiczny
  6.   private function __clone(){} //Uniemozliwia utworzenie kopii obiektu
  7.  
  8.   public static function getInstance ()
  9.    {
  10.        if (self::$instance === null) {
  11.            self::$instance = new self();
  12.        }
  13.        return self::$instance;
  14.    }
  15. }
  16.  
  17. // Pobieramy instancję
  18.  
  19. $singleton = Singleton::getInstance();
  20. ?>
bliitz
  1. <?
  2.        public function check_user_exists($login) {
  3.            
  4.                       $pdo = new PDO('mysql:host=localhost;dbname=website_content', 'login', 'pass');
  5.           $stmt = $pdo -> prepare( 'SELECT `id`, `login` FROM `users` WHERE `login` = :login');
  6.              $stmt->bindValue( ':login', '$login', PDO::PARAM_STR );
  7.              $stmt->execute();
  8.      
  9.              if( $stmt -> fetch() ){
  10.      
  11.                  echo 'Zalogowany jako:&nbsp;';
  12.      
  13.              }
  14.      
  15.              else{
  16.    
  17.                echo 'Istnieje już użytkownik o loginie'.$login.'! Wybierz inna nazwę.';
  18.      
  19.              }
  20.                    
  21.        }
  22. ?>


jeśli stosujesz $pdo->prepare to nie używasz już $pdo->query
rozny
  1. <?php
  2.        public function check_user_exists($login, $email) {
  3.            try {
  4.            $pdo = new PDO ( 'mysql:host=localhost; dbname=website_content', 'root', 'vertrigo', array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin2" ) );
  5.            $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.            $stmt = $pdo -> prepare( 'SELECT `id`, `login`, `email` FROM `users` WHERE `login` = :login AND `email` = :email');
  7.              $stmt->bindValue( ':login', '$login', PDO::PARAM_STR );
  8.              $stmt->bindValue( ':email', '$email', PDO::PARAM_STR );
  9.              $stmt->execute();
  10.      
  11.              if( $stmt -> fetch() ){
  12.      
  13.                  echo 'Zalogowany jako:&nbsp;'.$login;
  14.      
  15.              }
  16.      
  17.              else{
  18.    
  19.                echo 'Istnieje już użytkownik o loginie&nbsp;<strong>'.$login.'</strong>&nbsp;lub wprowadzony adres e-mail&nbsp;<strong>'.$email.'</strong>&nbsp;istnieje już w naszej bazie danych</strong>&nbsp;Wybierz inna nazwę użytkownika lub adres e-mail.';
  20.      
  21.              }
  22.                    
  23.        }
  24.        catch (PDOException $e) {
  25.            echo 'Nawiązanie połązcenia nie powiodło się: ' . $e->getMessage();
  26.        }
  27.        }
  28. ?>


No dobra, zrobiłem tak i w sumie dalej jest to samo. Nie robi różnicy co wklepie w formularz. Dodałem jeszcze sprawdzanie mejla i raportowanie błędów. Mam nadzieje, że bez błędnie winksmiley.jpg Mimo wszystko, gdzieś tu musi siedzieć błąd logiczny, że to nie działa tak jak powinno... Skryptowi po prostu nie robi różnicy co dostanie w zapytaniu. Jak by w ogóle nie sprawdzał co siedzi w bazie danych... Ja jakoś nie mogę go odkopać winksmiley.jpg

Dobra już sobie poradziłem smile.gif Brakowało mi pętli, która by to sprawdzała winksmiley.jpg

Pozdrawiam i dzięki za pomoc.
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.