Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Obiekt Bazy danych używany wszędzie
hunter1988
post 2.06.2013, 10:59:43
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 31.05.2013

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


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.

Ten post edytował hunter1988 2.06.2013, 11:00:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
pmir13
post 2.06.2013, 12:20:01
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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.

Ten post edytował pmir13 2.06.2013, 12:25:19
Go to the top of the page
+Quote Post
hunter1988
post 2.06.2013, 12:37:33
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 31.05.2013

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


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 ?

Ten post edytował hunter1988 2.06.2013, 12:40:13
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: 14.08.2025 - 12:13