Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] singleton a trzy bazy danych
patryczakowy
post 22.01.2011, 08:06:39
Post #1





Grupa: Zarejestrowani
Postów: 420
Pomógł: 44
Dołączył: 22.10.2008

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


Witam mam mały problem mam skrypt który korzysta z trzech baz danych założenie było takie żeby podczas wykonywania skryptu były maksymalnie trzy połączenia z bazą dlatego chciałem zimplementować wzorzec singleton dl a każdej z baz jednak problem jest taki że podczas wywołania klasy z połączeniem do drugiej bazy połączenie z pierwszą zostaje przerwane po niżej przykładowy kody
  1. class db_portal extends db{
  2.  
  3.  
  4. private function __construct() {
  5. $cfg['db']['host']='localhost';
  6. $cfg['db']['user']='xxxxxx';
  7. $cfg['db']['password']='xxxxx';
  8. $cfg['db']['name']='xxxxxx';
  9. $this->conn_id = mysql_connect($cfg['db']['host'],$cfg['db']['user'],$cfg['db']['password']);
  10. mysql_select_db($cfg['db']['name'],$this->conn_id);
  11. mysql_query("SET CHARACTER SET utf8");
  12. mysql_query("SET collation_connection = utf8_unicode_ci");
  13. if(! is_resource($this->conn_id)) {
  14. return false;
  15. }
  16. }
  17. static public function connect_db () {
  18. static $objDB;
  19. if(!isset($objDB))
  20. $objDB = new db_portal;
  21.  
  22. return $objDB;
  23. }
  24. }
  25. class db_portal2 extends db{
  26.  
  27.  
  28. private function __construct() {
  29. $cfg['db']['host']='localhost';
  30. $cfg['db']['user']='xxxxxx';
  31. $cfg['db']['password']='xxxxx';
  32. $cfg['db']['name']='xxxxxx';
  33. $this->conn_id = mysql_connect($cfg['db']['host'],$cfg['db']['user'],$cfg['db']['password']);
  34. mysql_select_db($cfg['db']['name'],$this->conn_id);
  35. mysql_query("SET CHARACTER SET utf8");
  36. mysql_query("SET collation_connection = utf8_unicode_ci");
  37. if(! is_resource($this->conn_id)) {
  38. return false;
  39. }
  40. }
  41. static public function connect_db () {
  42. static $objDB;
  43. if(!isset($objDB))
  44. $objDB = new db_portal2;
  45.  
  46. return $objDB;
  47. }
  48. }
  49. $DB=db_portal::connect_db();
  50. //zapytania z bazy 1
  51. $DB2=db_portal2::connect_db();
  52. // zapytania z bazy 2
  53. $DB->query($SQL);
  54. //problem objekt $DB istnieje ale niema już połączenia z bazą przez co zapytanie się nie wykonuje
  55. //nie pomaga nawet dodanie linii wcześniej $DB=db_portal::connect_db();

Klasa db to standardowa klasa mająca metody typu query fetch itp

Ma ktoś pomysł jak można to rozwiązaćquestionmark.gif?

Z góry dzięki za sugestie.

Ten post edytował patryczakowy 22.01.2011, 08:07:27


--------------------
Sztuką jest widzieć to czego nie widać.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Smertius
post 22.01.2011, 10:00:59
Post #2





Grupa: Zarejestrowani
Postów: 156
Pomógł: 31
Dołączył: 23.02.2009
Skąd: Sanok

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


Wg mnie powinieneś łączenie z bazą danych przenieść do konstruktora bazy DB, a w klasach które po niej dziedziczą wywoływać konstruktor rodzica przez parent::__construct(), nie ma sensu tego pchać do każdej klasy w dodatku jeśli będziesz chciał zmienić dane do BD to bedziesz to zmieniał w N klasach? Trochę to niewygodne.

Co do Singeltona, to błędnie go implementujesz. Rzuć okiem na kod:

  1. class klasa {
  2.  
  3. private static $instance;
  4.  
  5. public function __construct() {
  6. if (!(self::$instance instanceof klasa)) {
  7. self::$instance = $this;
  8. return self::$instance;
  9. } else {
  10. return self::$instance;
  11. }
  12. }
  13. }


Tak jak powyżej, jeśli po pierwszym utworzeniu obiektu "klasa", spróbujesz go utworzyć jeszcze raz (new Klasa) to zostanie zwrócony już istniejąca instancja "klasa"

IMHO mamy PDO, mamy ORM a ludzie dalej korzystają z niewygodych, przestarzałych funkcji typu mysql_query itp. ...
Go to the top of the page
+Quote Post

Posty w temacie


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 - 17:25