Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] klasa logowania z wykorzystaniem PDO
Forum PHP.pl > Forum > Przedszkole
wjkbdg
Witam,

mam sobie zapoczątkowaną klasę Login.

  1. <?php
  2. include_once("config.php");
  3.  
  4. class Login 
  5. {
  6. var $username;
  7. var $password;
  8.  
  9. public function __construct()
  10. {
  11. $this->connectToMysql();
  12. if(!isset($_SESSION['auth']))
  13. {
  14. $_SESSION['auth'] = 0;
  15. }
  16. }
  17.  
  18. public function connectToMysql()  
  19. {
  20. $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', ''.DB_USER.'', ''.DB_PASS.'', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  21. }
  22.  
  23. public function userRegistration($username, $password, $email)
  24. {
  25.  //$this->connectToMysql();
  26.  //$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', ''.DB_USER.'', ''.DB_PASS.'', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  27.  $stmt = $pdo -> prepare('INSERT INTO `users` (`username`, `password`, `email`) VALUES(
  28. :username,
  29. :password,
  30. :email)');  
  31.  
  32. $stmt -> bindValue(':username', $username, PDO::PARAM_STR);
  33. $stmt -> bindValue(':password', $password, PDO::PARAM_STR);
  34. $stmt -> bindValue(':email', $email, PDO::PARAM_STR);
  35.  
  36. if($registration = $stmt -> execute())
  37.  {
  38.  echo "Użytkownik ".$_POST['username']." został zarejestrowany.<br/><a href='index.php'>Strona główna<a/>";
  39.  }
  40. }
  41. }
  42. ?>


Zawiera ona metodę connectToMysql, która wykonywana jest w konstruktorze i działa ok - łączy się z bazą.
Problem pojawia się w chwili rejestracji nowego użytkownika i brzmi tak:
  1. Fatal error: Call to a member function prepare() on a non-object in E:\httpd\rowery\lib\class_login.php on line 28


Ta informacja zbija mnie trochę z tropu, bo przecież obiekt PDO jest tworzony w konstruktorze.
Dodanie w metodzie userRegistration
  1. <?php
  2. $this->connectToMysql();
  3. ?>

również nie pomaga, a chyba powinno. Czy czegoś nie rozumiem?

Poprawnie wykonane zapytanie jest tylko w przypadku dodania:
  1. <?php
  2. $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', ''.DB_USER.'', ''.DB_PASS.'', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  3. ?>



Moje pytanie brzmi dlaczego utworzony w konstruktorze obiekt PDO nie funkcjonuje w metodach tej klasy i trzeba tworzyć go ponownie?
Kicok
Pomijając już fakt łączenia się z bazą danych w klasie Login powiem: 'Zasięg zmiennych'
W metodzie userRegistration nie masz zadeklarowanej zmiennej $pdo, a próbujesz się do niej odwołać jak do obiektu.
wjkbdg
Pewnie to co napisałeś o zasięgu zmiennych pomoże rozwiązać problem, ale równie interesujące jest to co napisałeś o łączeniu z bazą danych z poziomu klasy login. Jak według Ciebie powinno to wyglądać? Interesuje mnie teoretyczne podejście do tego zagadnienia. Czy powinna istnieć odrębna klasa dla połączenia z bazą?
Kicok
Cytat
Jak według Ciebie powinno to wyglądać? Interesuje mnie teoretyczne podejście do tego zagadnienia. Czy powinna istnieć odrębna klasa dla połączenia z bazą?


Dokładnie - i klasą tą jest już PDO, więc w sumie nie musisz robić nakładki na nią. Obiekt tej klasy możesz przekazywać do innych klas w konstruktorze, np.:
  1. <?php
  2.  
  3. class Login
  4. {
  5. private $db;
  6.  
  7. private $username;
  8. private $password;
  9. private $emal;
  10.  
  11.  
  12. public function __construct( PDO $db )
  13. {
  14. $this->db = $db;
  15. }
  16.  
  17. public function loguj()
  18. {
  19. $stmt = $this->db->prepare( // ...
  20. }
  21. }
  22.  
  23.  
  24. // (...)
  25.  
  26. $db = new PDO( 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS );
  27.  
  28. $login = new Login( $db );
  29.  
  30. ?>
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.