Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Błąd Call to a member function prepare() on a non-object, problem z kodem.
casperii
post 7.05.2016, 17:58:24
Post #1





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Panowie próbuje się zalogować poprzez ajax. Niestety otrzymuje bład w pliku class.php
Fatal error: Call to a member function prepare() on a non-object in line 13 czyli linia gdzie jest:

  1. $sql = $this->db->prepare("SELECT * FROM tabelka WHERE user=:login") or die ($db->errorInfo());


class.php
  1. class xx{
  2. private $db;
  3.  
  4. function __construct($con){
  5. $this->pdo = $con;
  6.  
  7. }
  8. }


Może ktoś podpowiedzieć co robię źle?

Ten post edytował casperii 7.05.2016, 18:20:01
Go to the top of the page
+Quote Post
rad11
post 7.05.2016, 18:08:29
Post #2





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


  1. $this->pdo


a nie

  1. $this->db
Go to the top of the page
+Quote Post
casperii
post 7.05.2016, 19:17:11
Post #3





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Dziękuje @rad11 .
Jeszcze mam pytanie odnośnie logowania, bo coś nie idzie.
Otóż loguje się poprzez Ajax i tu mam kilka pytań,
czy jeśli nie wpiszę loginu i hasła to błędy mam pluć w pliku ajaxowym coś na styl:

  1. $value_login = trim($_POST['login']);
  2. $value_password = trim(md5($_POST['pass']));
  3.  
  4. if(empty($value_login)){
  5. $message_error = 'Nie wpisano loginu.';
  6. echo $message_error;
  7. }
  8. elseif(empty($value_password)){
  9. $message_error = 'Nie wpisano hasła.';
  10. echo $message_error;
  11. }


czy da radę to zrobić w class.php ? Jeżeli tak to w jaki sposób i jak później przekazać komunikat do ajax:

class.php:
  1. public function AjaxLogin($value_login, $value_password)
  2. {
  3. $sql = $this->db->prepare("SELECT * FROM `users` WHERE login=:user AND pass=:password") or die ($db->errorInfo());
  4. $sql->bindValue(':user', $value_login, PDO::PARAM_STR);
  5. $sql->bindValue(':password', $value_password, PDO::PARAM_STR);
  6. $sql->execute();
  7. $row = $sql->fetch(PDO::FETCH_ASSOC);
  8. if($sql->rowCount()!=0){
  9. $test = 'supper';
  10. }
  11. return $sql;
  12. }


ajax.php:

  1. if($_POST['action'] == 'user_login'){
  2.  
  3. if($cos->AjaxLogin($value_login, $value_password)){
  4. var_dump($sql);
  5. }


Gdzie i jak powinno wyglądać czy user znajduje się w bazie? w strukturalnym to bym przeleciał pętlą while i sprawdził czy jest większy od 0 i stosowny komunikat.
Tylko jak to teraz połączyć tą klase z wstawieniem tego do Ajax. Czy mógłbyś pomóc?

Ten post edytował casperii 7.05.2016, 19:42:21
Go to the top of the page
+Quote Post
CuteOne
post 7.05.2016, 21:44:56
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Hmm, a nie lepiej rzucać json'a jako odpowiedź serwera? np
  1. class MySpecialException extends Exception {}
  2.  
  3. ///...
  4.  
  5. try {
  6. if(empty($value_login)){
  7. throw new \MySpecialException('Nie wpisano loginu.');
  8. }
  9.  
  10. echo json_encode([
  11. 'status' => 1,
  12. 'content' => 'bla bla bla'
  13. ]);
  14. } catch (\MySpecialException $e) {
  15. $this->logger->add($e); //logowanie błedów
  16. echo json_encode([
  17. 'status' => 0,
  18. 'error' => $e->getMessage()
  19. ]);
  20. } catch (\Exception $e) {
  21. $this->logger->add($e); //logowanie błedów
  22. echo json_encode([
  23. 'status' => 0,
  24. 'error' => 'Nie udało się wykonać'
  25. ]);
  26. }


Ten post edytował CuteOne 7.05.2016, 21:45:33
Go to the top of the page
+Quote Post
com
post 8.05.2016, 00:47:37
Post #5





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


rad11 co za bzdury wypisujesz, właśnie że db tylko w konstruktorze wypadało zmienić z $this->pdo na db, bo tak zrobił zmienna publiczną tam.
Go to the top of the page
+Quote Post
casperii
post 8.05.2016, 10:24:11
Post #6





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


@com czy mógłbyś mi wytłumaczyć jak powinna wyglądać komunikacja pomiędzy dwoma plikami? :

  1. <?php
  2. class cos{
  3. private $db;
  4.  
  5. function __construct($con){
  6. $this->db = $con;
  7.  
  8. }
  9. public function AjaxLogin($value_login, $value_password) //
  10. {
  11. $sql = $this->db->prepare("SELECT * FROM `users` WHERE login=:user OR email=:mail AND pass=:password") or die ($db->errorInfo());
  12. $sql->bindValue(':user', $value_login, PDO::PARAM_STR);
  13. $sql->bindValue(':mail', $value_login, PDO::PARAM_STR);
  14. $sql->bindValue(':password', $value_password, PDO::PARAM_STR);
  15. $sql->execute();
  16. return $sql->fetch(PDO::FETCH_ASSOC);
  17. }
  18. }
  19. ?>


oraz plik ajaxowy.php do którego odwołuje się w pliku index.php. Wiem, że najłatwiej było by po prostu w w pliku ajaxowym bez kombinowania zrobić zapytanie i w zależności czy user istnieje czy nie lub plucie komunikatem jeśli czegoś user nie wpisał i jsonem lub echem wysłać do indexa stosowny komunikat.
Ale ja chce to zrobić na classach które są wczytywane do pliku ajaxowego z pliku class.php , czyli musi być komunikacja pomiędzy dwoma plikami ajaxowy.php , class.php a stosowny komunikat wyświetlić w index.php poprzez json lub echo.

ajaxowy.php
  1. if($_POST['action'] == 'user_login'){
  2. //tu trzeba pobrać klase AjaxLogin ze stosownym komunikatem.
  3. }


Rozumiem, że jeśli user nie wpisze loginu lub hasła to mogę pluć komunikatem bezpośrednio z pliku ajaxowy.php np.

  1. if(empty($value_login)){
  2. //tu json lub echo
  3. }
  4. elseif(empty($value_password)){
  5. //tu json lub echo
  6. }


ale jak zrobić tą komunikację pomiędzy ajaxowy.php a class. że ajaxowy pobierze wartości przekaże je do class.php i w zależności jeśli user istnieje zwróci zalogowany==true i wtedy ajaxowy tworzyłby sesje? a jeśli user nie istnieje klasa AjaxLogin zwróci zalogowany==false do pliku ajaxowy.php i tu sobie wyświetle odpowiedni komunikat.

Myślę, że dobrze kombinuje ?
Go to the top of the page
+Quote Post
com
post 8.05.2016, 13:15:14
Post #7





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


ale w czym jest problem bo nie bardzo rozumiem? przecież możesz w jeden metodzie wywołać klasę z innego pliku? tylko najpierw musisz ja wczytać, jak używasz composera to nie musisz się tym martwić, jak nie to ją importujesz, w jakimś głównym pliku a potem przekazujesz obiekt do metody i wykonujesz operacje jaka potrzebujesz wink.gif
Go to the top of the page
+Quote Post
casperii
post 8.05.2016, 14:54:46
Post #8





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


@com gdybym nie miał problemu to bym nie pytał się na forum.

w ajaxowym mam tak:

  1. $value_login = trim($_POST['login']);
  2. $value_password = trim(md5($_POST['pass']));
  3.  
  4.  
  5. if($cos->AjaxLogin($value_login, $value_password)){
  6. // tu chcę odebrać return $msg_err oraz $msg_ok
  7. }

w powyższym pliku chciałbym odebrać informacje z pliku class.php

class.php:
  1. public function AjaxLogin($value_login, $value_password)
  2. {
  3. $sql = $this->db->prepare("SELECT * FROM `users` WHERE (login=:user OR email=:mail) AND pass=:password") or die ($db->errorInfo());
  4. $sql->bindValue(':user', $value_login, PDO::PARAM_STR);
  5. $sql->bindValue(':mail', $value_login, PDO::PARAM_STR);
  6. $sql->bindValue(':password', $value_password, PDO::PARAM_STR);
  7. $sql->execute();
  8. $row = $sql->fetch(PDO::FETCH_ASSOC);
  9.  
  10. if(empty($value_login)){
  11. //echo 'Proszę podać login.'; //jeśli robię echem to w indexie się pokazuje
  12. $msg_err = 'Proszę podać login';
  13. }
  14. elseif(empty($value_password) || $value_password != $row['pass']){
  15. $msg_err = 'Proszę podać prawidłowe hasło.';
  16. }
  17.  
  18. if(empty($msg_err)){
  19. echo 'super';
  20. $msg_ok = 'ok';
  21. }
  22.  
  23. return $msg_err;
  24. return $msg_ok;
  25. }


Chodzi mi teraz jak przenieść info z 1 pliku do drugiego. AjaxLogin($msg_err); nie działa.
Go to the top of the page
+Quote Post
CuteOne
post 8.05.2016, 14:57:57
Post #9





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  1. class A {
  2. public function make($dane) {
  3. echo 'a' . $dane;
  4. }
  5. }


  1. include 'A.php';
  2.  
  3. $dane = 'b';
  4. $a = new A();
  5. $a->make($dane);

Go to the top of the page
+Quote Post
com
post 8.05.2016, 15:46:55
Post #10





Grupa: Zarejestrowani
Postów: 3 032
Pomógł: 366
Dołączył: 24.05.2012

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


po pierwsze to nie return, return bo drugi nigdy nie zadziała.

no to
  1. class Foo
  2. {
  3. public function bar($bar)
  4. {
  5. if($bar === 'bar') {
  6. return true;
  7. }
  8. return false;
  9. }
  10.  
  11. class Bar
  12. {
  13. private $foo;
  14. public function __construct(Foo $foo)
  15. {
  16. $this->foo = $foo;
  17. }
  18. public function foo($bar)
  19. {
  20. $result = $this->foo->bar($bar);
  21. // no i tu cokolwiek z tym robisz
  22. }
  23.  


czyli AjaxLogin($value_login, $value_password) powinno zwracać true || false, a komunikaty o błędach przechowujesz w property i w razie potrzeby zwracasz geterem.


Ten post edytował com 8.05.2016, 15:16:32
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.04.2024 - 14:58