Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Obiekt Bazy danych używany wszędzie
Forum PHP.pl > Forum > Przedszkole
hunter1988
Mam problem, widocznie nie wystarczająco rozumiem zasięgu zmiennych oraz obiektów

Mam sobie plik z łączeniem z bazą danych config.php
  1. class Database{
  2. private static $datasource='mysql:host=localhost;dbname=XXX';
  3. private static $username='XXX';
  4. private static $password='XXX';
  5. private static $db;
  6.  
  7.  
  8. private function __construct(){}
  9.  
  10. public static function getDB(){
  11. if(!isset(self::$db)){
  12. try{
  13. self::$db=new PDO(self::$datasource,self::$username,self::$password);
  14.  
  15. }
  16. catch(PDOExceptin $e)
  17. {
  18. $error=$e->getMessage();
  19. exit();
  20. }
  21. }
  22. return self::$db;
  23. }
  24.  
  25. }
  26.  


No i tutaj wszystko działa, problem rodzi się gdy chce coś dodać bo bazy, ładuje plik z klasą odpowiedzialną za łączenie z bazą danych require_once ('config.php'); zarówno w pliku index.php jak i pliku który przechowuje pozostałe klasy nowaclass.php. Zacząłem pisać klasę odpowiedzialną za tworzenie użytkownika,

  1. class Uzytkownik
  2. {
  3.  
  4. public function __construct()
  5. {
  6. $pdo = Database::getDB();
  7. }
  8.  
  9. public function addUser()
  10. {
  11.  
  12. $this->pdo -> exec('INSERT INTO `users` (`login`) VALUES(
  13. \'Login_Login\')');
  14.  
  15. }
  16.  
  17. }


Coś takiego nie przynosi rezultatu i oddaje błąd, że funkcją exec próbuje odwołać się do czegoś co nie jest obiektem
"Fatal error: Call to a member function exec() on a non-object"

Ale gdy tą metodę zrobię w ten sposób
  1. class Uzytkownik
  2. {
  3. public function addUser()
  4. {
  5. $pdo = Database::getDB();
  6. $this->pdo -> exec('INSERT INTO `users` (`login`) VALUES(
  7. \'Login_Login\')');
  8. }
  9.  
  10. }


Wszystko działa ok, stąd moje pytanie, jak zrobić iż globalnie tworzę obiekt $pdo = Database::getDB(); i nie muszę łączyć się z bazą danych za każdym razem w metodzie gdy chcę tego użyć ?
Opcjonalnie nie tylko w danej klasie ale także dla innych klas.
pmir13
Szczerze mówiąc oba sposoby przy takiej składni nie powinny działać, czy czasem nie zrobiłeś gdzieś błędu przy wklejaniu kodu?
Albo definiujesz zmienną $pdo i wtedy używasz jej w zakresie jej widoczności, czyli tak jak prawdopodobnie wygląda drugi działający sposób:

  1. public function addUser()
  2. {
  3. $pdo = Database::getDB();
  4. $pdo->exec(...);
  5. }


albo też definiujesz jako property dla klasy i wtedy używasz tak:
  1. public function __construct()
  2. {
  3. $this->pdo = Database::getDB();
  4. }
  5.  
  6. public function addUser()
  7. {
  8. $this->pdo -> exec(...);
  9. }


Poza tym w obu przypadkach wykorzystujesz istniejące już połączenie z bazą. Gwarantuje to klasa Database zrobiona jako singleton, getDB() zwraca tą samą instancję klasy PDO za każdym razem lub ewentualnie tworzy ją jeśli jej jeszcze nie ma.
hunter1988
Czyli jeżeli mam połączenie które już istnieje to za każdym razem jak piszę nową klasę i chce działać na bazie danych muszę w konstruktorze $this->pdo = Database::getDB(); (chodzi mi o to żeby w jednym miejscu ustawić połączenie które będzie wszędzie, a potem odwoływać się tylko do obiektu pdo)
To jest chyba odwoływanie się do połączenia które już istnieje ? Jeżeli dobrze mi się wydaje to jak powinno się działać na bazie danych, tworzyć nowe metody itp ?
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.