Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] singleton a trzy bazy danych
patryczakowy
post
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ć(IMG:style_emoticons/default/questionmark.gif) ?

Z góry dzięki za sugestie.

Ten post edytował patryczakowy 22.01.2011, 08:07:27
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





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

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


1. mysql_query powinno mieć określone z którego połączenia korzysta (patrz drugi argument funkcji).
2. Przestań korzystać z Singletona, bo na stronach WWW jest naprawdę baaaaardzo niewiele sytuacji, gdzie jego użycie miałoby sens, a korzystanie z tego wzorca poza jedną zaletą (powodem, dla którego stworzono go - czyli zapewnieniem istnienia co najwyżej jeden instancji danej klasy) ciągnie za sobą masę problemów.
3. Zapewne korzystasz z Singletona by uzyskać globalny dostęp do bazy danych (to jest złe użycie oczywiście), ale mógłbyś wykorzystać coś takiego:
  1. // Zakładam, że klasa DB to mniej-więcej coś takiego:
  2.  
  3. class DB {
  4. protected $connection;
  5.  
  6. public function __construct($host, ...) {
  7. $this->connection = mysql_connect(...);
  8. }
  9.  
  10. public function query($sql) {
  11. $result = mysql_query($sql, $this->connection);
  12. }
  13.  
  14. // etc.
  15. }
  16.  
  17. // Tak więc utwórzmy sobie najpierw jakiegoś globalnego (złe, ale skoro tak już musisz mieć) menadżera połączeń:
  18. class DBManager {
  19. protected static $connections = array();
  20.  
  21. public static function get($name) {
  22. return self::$connections[$name];
  23. }
  24.  
  25. public static function set($name, DB $connection) {
  26. self::$connections[$name] = $connection;
  27. }
  28. }
  29.  
  30. // W którymś tam miejscu skryptu inicjalizujesz połączenia:
  31.  
  32. $defaultConnection = new DB('...', '...');
  33. $extraConnection = new DB('....');
  34. $yetAnotherConnection = new DB(...);
  35.  
  36. // I dodajesz je do menadżera:
  37.  
  38. DBManager::set('default', $defaultConnection);
  39. DBManager::set('extra', $extraConnection);
  40. DBManager::set('yetAnothert', $yetAnotherConnection);
  41.  
  42. // Teraz w dowolnej części aplikacji możesz zrobić coś w stylu:
  43.  
  44. $db = DBManager::get('extra');
  45. $db->query('...');
  46.  
  47. $db = DBManager::get('default');
  48. $db->fetchArray('....');


Cytat
Tzn?
To znaczy, że to co podałeś nie jest Singletonem. To papka bezsensownego kodu (konstruktor zwracający coś? wtf?!)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 15:37