Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Singleton, PDO i zapytanie do bazy
Forum PHP.pl > Forum > Przedszkole
Zuras
Witam, mam problem z z zapytaniem do bazy danych za pomocą PDO.

Stworzyłem klasę do obsługi połączenia z bazą danych, posługując się wzorcem singleton:

  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new database;
  8. }else{
  9. return self::$db;
  10. }
  11. }
  12.  
  13. private function __construct() {
  14. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  15. }
  16. }


oraz klasę obsługującą zapytanie insert:

  1. class trening{
  2.  
  3. public $db_conn;
  4. public $sql;
  5. public $stmt;
  6.  
  7. public function insert() {
  8. $this->db_conn = database::getInstance();
  9. $this->sql = 'INSERT INTO treningi (Data,CzasTreningu,Dystans,SrPuls) VALUES (:data,:czas,:dystans,:puls)';
  10. $this->stmt = $this->db_conn->prepare($this->sql);
  11. $this->stmt->execute(array(
  12. ':data' => '2014-10-06',
  13. ':czas' => '50',
  14. ':dystans' => '5000',
  15. ':puls' => '120')
  16. );
  17.  
  18. }
  19. }


tworzenie obiektu oraz wywyołanie metody:

  1. $bieganie = new trening;
  2. $bieganie -> insert();


Według tutoriali wszystko powinno działać, jednak wywala błąd:
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\my\index.php on line 29

linia 29 w moim przypadku to:
  1. $this->stmt = $this->db_conn->prepare($this->sql);


Uczę się i proszę o pomoc, lub wskazówki co jest nie tak.
Pyton_000
  1. else{
  2. return self::$db;
  3. }

zostaw samo return;
Zuras
Cytat(Pyton_000 @ 5.10.2014, 12:14:08 ) *
  1. else{
  2. return self::$db;
  3. }

zostaw samo return;


Dalej ten sam błąd.
Pyton_000
Ahh..

Zauważ że:
Robiąc getInstance sprawdzasz czy zmienna $db nie jest pusta.
Jeżeli jest pusta to jest inicjowana obiektem database a nie PDO.

Czyli zamiast new database podstaw to co masz w konstruktorze.
Zuras
Cytat(Pyton_000 @ 5.10.2014, 12:25:25 ) *
Ahh..

Zauważ że:
Robiąc getInstance sprawdzasz czy zmienna $db nie jest pusta.
Jeżeli jest pusta to jest inicjowana obiektem database a nie PDO.

Czyli zamiast new database podstaw to co masz w konstruktorze.


Zmieniłem tak:
  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  8. }
  9. return;
  10.  
  11. }
  12.  
  13. private function __construct() {
  14. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  15. }
  16. }


Dalej ten sam błąd...
Turson
Dalej nie ogarniasz. Co to w ogóle zwracasz? Nic.

  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new database;
  8. }
  9. return self::$db;
  10.  
  11. }
  12.  
  13. private function __construct() {
  14. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  15. }
  16. }
Zuras
Cytat(Turson @ 5.10.2014, 12:41:11 ) *
Dalej nie ogarniasz. Co to w ogóle zwracasz? Nic.

  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new database;
  8. }
  9. return self::$db;
  10.  
  11. }
  12.  
  13. private function __construct() {
  14. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  15. }
  16. }


Nie działa, siedziałem nad tym naprawdę długo i racja nie ogarniam dlatego pytam.
Pyton_000
Turson przeczytałeś mój post? wink.gif

  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  8. }
  9. return self::$db;
  10.  
  11. }
  12.  
  13. private function __construct() {}
  14. }

tak ma być.

Zuras
Cytat(Pyton_000 @ 5.10.2014, 12:49:45 ) *
Turson przeczytałeś mój post? wink.gif

  1. class database{
  2.  
  3. private static $db = null;
  4.  
  5. public static function getInstance() {
  6. If (self::$db == null) {
  7. self::$db = new PDO('mysql:host=localhost;dbname=bieganie', 'admin', 'admin');
  8. }
  9. return self::$db;
  10.  
  11. }
  12.  
  13. private function __construct() {}
  14. }

tak ma być.

Działa, dziękuję za pomoc i cierpliwość.
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.