Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL] PDO - Call to a member function query() on a non-object in, problem z zapytaniem SQL jak mniemam
rozny
post
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) (klasami i obiektami zainteresowałem się tak naprawdę dopiero dzisiaj (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) )

pozdrawiam

Ten post edytował rozny 24.03.2009, 22:21:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
rozny
post
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

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


Chyba nie będzie tak łatwo jak myślałem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ).

Co do lektury - właśnie z tej wikiksiążki korzystam od początku dzisiaj (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Inaczej chyba w ogóle bym tego nie ogarnął (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Maciekbjw
post
Post #3





Grupa: Zarejestrowani
Postów: 217
Pomógł: 23
Dołączył: 2.12.2007
Skąd: Warszawa

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


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? (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post

Posty w temacie


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: 13.10.2025 - 22:14