Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wykorzystanie połączenia z bazą danych w klasie
Forum PHP.pl > Forum > Przedszkole
Na 5tyk
Cześć.

Jako, że zacząłem uczyć się OOP i postanowiłem sobie napisać CMS (tylko w celu nauki) z wykorzystaniem OOP PHP.

Jednak natrafiłem na problem.

Błędy:
Kod
Notice: Undefined variable: db in D:\xampp\htdocs\CMS\class\User.php on line 13

Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\xampp\htdocs\CMS\class\User.php:13 Stack trace: #0 D:\xampp\htdocs\CMS\index.php(9): User->addNew('siema', 'na5tyk@o2.pl', 'xxx', 'xxx') #1 {main} thrown in D:\xampp\htdocs\CMS\class\User.php on line 13



Struktura projektu (* - folder):
* CMS
-- index.php
** class
--- User.php
** config
--- database.php

index.php
  1. <?php
  2.  
  3. include('config/database.php');
  4. include('class/User.php');
  5.  
  6. $nowy = new User();
  7.  
  8. $nowy->addNew('siema', 'na5tyk@o2.pl', 'xxx', 'xxx');
  9.  
  10. ?>


User.php
  1. <?php
  2.  
  3. class User {
  4.  
  5. //Metoda wysylajaca emaila o utworzeniu konta i prosba o aktywacja konta
  6. function sendActivationEmail($email) {
  7.  
  8. mail($email, 'Aktywacja konta', 'Aby aktywować konto kliknij w link: xxx');
  9. }
  10.  
  11. //Metoda tworzaca nowego uzytkownika
  12. function addNew($login, $email, $password, $repeatPassword) {
  13. $register = $db->prepare('INSERT INTO `users` (login, email, password, activation) VALUES (:login, :email. :password, :activation)');
  14.  
  15. $register->bindValue(':login', $login);
  16. $register->bindValue(':email', $email);
  17. $register->bindValue(':password', $password);
  18. $register->bindValue(':activation', rand(1000, 9999));
  19.  
  20. $register->execute();
  21.  
  22. sendActivationEmail($email);
  23. }
  24.  
  25. //Metoda ustawiajaca bana dla uzytkownika
  26. function setBan($id, $ban) {
  27. $db->execute("UPDATE users SET ban = '" . $ban . "' WHERE id = '" . $id . "'");
  28. }
  29.  
  30. //Metoda ustawiajaca czy uzytkownik jest aktywowany
  31. function setActivation($id, $code) {
  32. $db->execute("UPDATE users SET activation = '" . $code . "' WHERE id = '" . $id . "'");
  33. }
  34.  
  35. //Metoda ustawiajaca wartosc w okreslonej kolumnie
  36. function setParams($id, $param, $value) {
  37. $db->execute("UPDATE users SET '" . $param . "' = '" . $value . "' WHERE id = '" . $id . "'");
  38. }
  39. }
  40.  
  41. ?>


database.php
  1. <?php
  2.  
  3. $host = 'localhost';
  4. $username = 'root';
  5. $password = '';
  6. $database = 'cms';
  7.  
  8. try {
  9.  
  10. $db = new PDO('mysql:host=' . $host . ';dbname=' . $database . '', $username, $password,
  11. // wyłączenie zbędnego emulate prepares
  12. PDO::ATTR_EMULATE_PREPARES => false,
  13. // ustalenie sposobu raportowania błędów
  14. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  15. ));
  16.  
  17. } catch (PDOException $err) {
  18.  
  19. print "Error: " . $err->getMessage() . "<br/>";
  20. die();
  21. }
  22.  
  23. ?>


$repeatPassword jest dodane przyszłościowo gdy będę sprawdzał poprawność danych.

I teraz pytanie. Czy przesłanie zmiennej $db w parametrze metody będzie dobre czy jest lepszy sposób?
Tomplus
Proponuję zastosować DI

I w linijce, użyć parametru $db dla klasy User
  1. $nowy = new User($db);


a w klasie stworzyć dodatkową metodę, __construct
  1.  
  2. public function __construct($db) {
  3. $this->db = $db;
  4. }


Dzięki temu będzie działać Ci połączenie z bazą danych np. w linijce metody addUser, gdzie oczywiście potrzeba dopisać $this
  1. $register = $this->db->prepare();


--
Korekta nazwy metody magicznej na poprawną.
Na 5tyk
Po zastosowaniu twoich porad teraz mam błąd:
Kod
Notice: Undefined property: User::$db in D:\xampp\htdocs\CMS\class\User.php on line 19

Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\xampp\htdocs\CMS\class\User.php:19 Stack trace: #0 D:\xampp\htdocs\CMS\index.php(8): User->addNew('siema', 'na5tyk@o2.pl', 'gowno', 'gowno') #1 {main} thrown in D:\xampp\htdocs\CMS\class\User.php on line 19
Tomplus
To może pokaż jak zaimplementowałeś te porady w klasie User.

Chociaż zgodnie z tym co masz w komunikacie to coś nie tak masz w linii 19.
Na 5tyk
index.php
  1. <?php
  2.  
  3. include('config/database.php');
  4. include('class/User.php');
  5.  
  6. $nowy = new User($db);
  7.  
  8. $nowy->addNew('siema', 'na5tyk@o2.pl', 'xxx', 'xxx');
  9.  
  10. ?>


User.php
  1. <?php
  2.  
  3. class User {
  4.  
  5. function __constructor($db) {
  6.  
  7. $this->db = $db;
  8. }
  9.  
  10. //Metoda wysylajaca emaila o utworzeniu konta i prosba o aktywacja konta
  11. function sendActivationEmail($email) {
  12.  
  13. mail($email, 'Aktywacja konta', 'Aby aktywować konto kliknij w link: hihi');
  14. }
  15.  
  16. //Metoda tworzaca nowego uzytkownika
  17. function addNew($login, $email, $password, $repeatPassword) {
  18.  
  19. $register = $this->db->prepare('INSERT INTO `users` (login, email, password, activation) VALUES (:login, :email, :password, :activation)');
  20.  
  21. $register->bindValue(':login', $login);
  22. $register->bindValue(':email', $email);
  23. $register->bindValue(':password', $password);
  24. $register->bindValue(':activation', rand(1000, 9999));
  25.  
  26. $register->execute();
  27.  
  28. sendActivationEmail($email);
  29. }
  30.  
  31. //Metoda ustawiajaca bana dla uzytkownika
  32. function setBan($id, $ban) {
  33.  
  34. $db->execute("UPDATE users SET ban = '" . $ban . "' WHERE id = '" . $id . "'");
  35. }
  36.  
  37. //Metoda ustawiajaca czy uzytkownik jest aktywowany
  38. function setActivation($id, $code) {
  39.  
  40. $db->execute("UPDATE users SET activation = '" . $code . "' WHERE id = '" . $id . "'");
  41. }
  42.  
  43. //Metoda ustawiajaca wartosc w okreslonej kolumnie
  44. function setParams($id, $param, $value) {
  45.  
  46. $db->execute("UPDATE users SET '" . $param . "' = '" . $value . "' WHERE id = '" . $id . "'");
  47. }
  48. }
  49.  
  50. ?>
Tomplus
Połączenie PDO masz poprawnie zainicjowane?

  1. $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
markuz
Nie $db tylko $this->db w metodach klasy do której wstrzyknąłeś $db.
Na 5tyk
Myślę, że połączenie jest dobrze zrobione:
  1. <?php
  2.  
  3. $host = 'localhost';
  4. $username = 'root';
  5. $password = '';
  6. $database = 'cms';
  7.  
  8. try {
  9.  
  10. $db = new PDO('mysql:host=' . $host . ';dbname=' . $database . '', $username, $password,
  11. // wyłączenie zbędnego emulate prepares
  12. PDO::ATTR_EMULATE_PREPARES => false,
  13. // ustalenie sposobu raportowania błędów
  14. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  15. ));
  16.  
  17. } catch (PDOException $err) {
  18.  
  19. print "Error: " . $err->getMessage() . "<br/>";
  20. die();
  21. }
  22.  
  23. ?>



Cytat(markuz @ 17.06.2017, 15:27:49 ) *
Nie $db tylko $this->db w metodach klasy do której wstrzyknąłeś $db.

Mówimy tylko o funkcji addNew().
nospor
Nie
function __constructor($db) {

a:
function __construct($db) {
Na 5tyk
Dzięki wielkie <3
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.