Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PDO singleton
tabbi
post
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 30.10.2010

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


  1. class Mysql{
  2.  
  3. public $db;
  4. static private $instance = null;
  5.  
  6. private function __construct(){
  7.  
  8. $Parm['DBHost'] = 'localhost';
  9. $Parm['DBLogin'] = 'szpital';
  10. $Parm['DBPass'] = 'asdasd';
  11. $Parm['DBName'] = 'prorapid';
  12. $Parm['DBType'] = 'mysql';
  13. try
  14. {
  15. $this->db = new PDO($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);
  16. $this->db-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  17. }
  18. //Wyświetlanie błędów wrazie niepowodzenia uruchamiania rozszerzenia
  19. catch(PDOException $e)
  20. {
  21. echo $e->getMessage();
  22. }
  23.  
  24. }
  25.  
  26. static public function getInstance(){
  27. if(self::$instance == null){
  28. $c= __CLASS__;
  29. self::$instance = new $c();
  30. }
  31. return self::$instance;
  32. }
  33. }
  34.  
  35. class Pliki {
  36.  
  37. //dołączenie referencji z class_serwisy.php class_mysql.php
  38. private $serwer = null;
  39. private $db = null;
  40.  
  41. function __construct($ID){
  42.  
  43. //doczepienie klasy class_serwisy.php
  44. //$this->serwer=Serwisy::getInstance();
  45.  
  46. //doczepienie klasy class_mysql.php
  47. $this->db=Mysql::getInstance();
  48. }
  49.  
  50. function Fileserve($data){
  51.  
  52. $result=$this->db->prepare("
  53. SELECT
  54. sname, pass
  55. FROM
  56. demo_servers
  57. WHERE
  58. selected = 1
  59. ORDER BY traffic_left
  60. DESC LIMIT 1
  61. ");
  62. $result->execute();
  63. $account=$result->fetch(PDO::FETCH_ASSOC);
  64. }
  65. }
  66.  
  67. $id=1;
  68. $pliki = new Pliki($id);
  69. $data=1;
  70. $x=$pliki->Fileserve($data);


I wywala blad call to undefined method Mysql::prepare() czyli obiekt PDO nie jest stworzony a raczej zreferowany z Klasy Mysql. Pytanie czemu sie tak dzieje, troche przeczytałem o singleton i ten wzorzecz projektowy jest ciekawy, tworzy obiekt raz a nastepnie jesli obiekt jest stworzony to tworzy referencje do niego i dzieki czemu jest mniejszy poziom alokowanej pamieci. JEDNAK ;p nie o tym pisać ale nie potrafie sobie poradzić z tym błędem. Więc prosiłbym o konkretne pokazanie patrz na ta linijke tu masz błąd tongue.gif dzieki wielkie siedze nad tym już troche i nie potrafie pójść dalej.
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. class Mysql extends PDO

A wtedy w konstruktorze zamiast
  1. $this->db = new PDO($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);


dajesz
  1. parent::__construct($Parm['DBType'].':dbname='.$Parm['DBName'].';host='.$Parm['DBHost'], $Parm['DBLogin'], $Parm['DBPass']);


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Widzisz gdzieś by klasa MySQL definiowała metodę prepare() albo by takową dziedziczyła? Nie.
Obiekt PDO masz dostępny pod MySQL->db, więc jeżeli obiekt MySQL masz dostępny pod Plik->db to z poziomu obiektu Plik musisz odwołać się przez Plik->db->db->prepare().

Nie masz też pojęcia czym jest Singleton i gdzie powinien być on wykorzystywany (w przypadku aplikacji WWW praktycznie nie ma dla niego zastosowań). Nie można go wiązać też z jakimkolwiek zużyciem pamięci, bo nie ma on z tym nic wspólnego.

Swoją drogą jaki jest cel istnienia klasy MySQL, skoro ona nie robi kompletnie niczego.

Ten post edytował Crozin 1.02.2011, 15:07:58
Go to the top of the page
+Quote Post
tabbi
post
Post #4





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 30.10.2010

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


Crozin jak zwykle motywująco tongue.gif z każdą Twoją uwagą pragne uczyć się więcej.
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 Aktualny czas: 21.08.2025 - 14:26