Gast alexC++ Geschrieben 12. Februar 2010 Geschrieben 12. Februar 2010 (bearbeitet) Singleton-Klasse für 3 Datenbankobjekte der unterschiedlichen Technologien Hallo, habe hier mal rumgespielt und wollte ein Singleton anwenden, welches bei der Datenbankverbindung flexibel ist. Also mehrere Datenbanken bedienen kann. Wer lust hat, kann ja mal drüber schauen. Wenn ein Fehler drin ist, bitte Bescheid sagen! Gruß class DatabaseConnection { private static $instance = array(); public static function getInstance($database){ //Wenn das Objekt schon vorhanden ist, wird es zurück gegeben if(isset(self::$instance[$database])){ return self::$instance[$database]; } //Datanbankverbindung für mysql aufbauen: if($database == 'mysql'){ try { self::$instance[$database] = new mysqli('localhost', 'root', '', 'lerndvd'); echo "Verbindung hergestellt! <br />"; return self::$instance[$database]; }catch(Exception $e) { echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage()); } //Datanbankverbindung für microsoft-sql aufbauen: }else if($database == 'mssql'){ try { self::$instance[$database] = mssql_connect('Server\\SQLEXPRESS', 'sa', '*') or die(); mssql_select_db('test'); echo "Verbindung mssql hergestellt! <br />"; return self::$instance[$database]; }catch(Exception $e) { echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage()); } //Datanbankverbindung für oracle aufbauen: }else if($database == 'oracle'){ try { //...Code Oracle return self::$instance[$database]; }catch(Exception $e) { echo "Fehler: " . HTML_SPECIALCHARS($e->getMessage()); } } } private function __construct() { } private function __clone() { } } Bearbeitet 12. Februar 2010 von alexC++ Zitieren
lit-web Geschrieben 12. Februar 2010 Geschrieben 12. Februar 2010 Hallo, also ich bin alles andere als sehr OOP erfahren, aber wie ich den Code so sehe (der besser in PHP Code tags wegen der lesbarkeit aufgehoben wäre) kommunizierst du da nicht mit mehreren Datenbanken sondern mit mehreren DBMS (Datenbankmanagementsystemen). So wie ich das sehe bekommst du da ein Problem wenn du von ein und dem selben DBMS also Beispielsweise Mysql mit mehreren Datenbanken kommunizieren willst. Denn der Nachteil bei dem Singletonpattern ist, das du nur eine Instanz auf ein Objekt bilden kannst. Ich denke in dem Fall wäre das registry Pattern besser angebracht, ahbe das selber noch nicht gemacht aber darüber gelesen. Mfg lit-web Zitieren
_n4p_ Geschrieben 12. Februar 2010 Geschrieben 12. Februar 2010 viel schlimmer find ich jetzt, das ich als anwender dieser klasse verschiedene dinge geliefert bekomme wenn ich DatabaseConnection::getInstance(); aufrufe. mal ist es ein objekt mal nur eine verbindungsresource. Zitieren
Gast alexC++ Geschrieben 16. Februar 2010 Geschrieben 16. Februar 2010 (bearbeitet) So wie ich das sehe bekommst du da ein Problem wenn du von ein und dem selben DBMS also Beispielsweise Mysql mit mehreren Datenbanken kommunizieren willst. ich habe hier mysql, mssql und oracle als dbms und ich bilde jeweils für diese ein objekt (bzw. eine verbindung -> _n4p_). Denn der Nachteil bei dem Singletonpattern ist, das du nur eine Instanz auf ein Objekt bilden kannst. das ist ja eben der sinn und zweck des singleton-patterns. ich hätte hier nur jeweils ein objekt für jede datenbank. @_n4p_ Für jeden datenbanktyp eine extra klasse wäre glaube ich am sinnvollsten. haben mysqli_connect und mysql_connect den gleichen rückgabetyp? dann könnte man es auch so machen. Gruß Bearbeitet 16. Februar 2010 von alexC++ Zitieren
lit-web Geschrieben 16. Februar 2010 Geschrieben 16. Februar 2010 In dem Fall wie der code aussieht hast du, wie ich schon schrieb nicht wirklich ein Objekt auf eine Datenbank in dem Sinne, sondern du handelst da 3 oder 4 DBMS ab DB != DBMS. Um mit den Datenbanken selber zu mommunizieren musst du erst mal eine Verbindung mit einem DBMS aufbauen, sagen wir mal Mysql. So und wenn die Verbindung steht, kann man erst mit einer Datenbank aus dem DBMS kommunizieren. Und da ist das Singletonpattern keine gute Wahl, was wenn ein System mit Mysql arbeitet und da aber mit 3 Datenbanken? Und schon hast du ein Problem, dann kannst du nicht mit allen 3 Datenbanken kommunizieren, das heist dafür solltest du auf Registry Pattern umsteigen, so hast du immer noch die Möglichkeit mit mehreren Datenbanken aus einem DBMS zu kommunizieren. Weiterer Problemfall der auftreten kann, wo ich ebenfalls das SingleTon Pattern als fehl am Platz finde, es gibt auch Anwendungen die mal mit mehreren DBMS arbeiten, sprich mal mit Mysql und Oracle zusammen, gibt einige Gründe warum man das machen könnte, dann hast du auch da wieder das Problem das du nur mit einem DBMS arbeiten kannst, also auch da würde ich auf das Registry Pattern umsteigen, dann kannst du mehrere Instanzen auf das DBMS Objekt bilden und bist somit flexibel, das du eben mit Mysql und Oracle arbeiten kannst. Mfg lit-web Zitieren
Aiun Geschrieben 16. Februar 2010 Geschrieben 16. Februar 2010 (bearbeitet) verschiedene Nachteile: 1. Wie angesprochen ist das Singleton hier nicht so zu empfehlen, denn du könntest mehrere, gleiche Datenbanken ansprechen wollen / müssen. 2. du hast die Konfiguration direkt im Code, was bedeutet du "kannst" zu jeder Datenbank nur eine Verbindung aufbauen. 3. das SQL der jeweiligen Datenbanken unterscheidet sich (gravierend genug, wie ich kürzlich feststellen musste). Es ist zwar ein Anfang, aber wirklich hilfreich wird es erst wenn du (fast) alle Kommandos an alle DBMS schicken kannst, ohne speziell dafür zu programmieren (insert, update, replace, select, ggf. subselects und joins). du gibst hier ja auch die Resource-pointer zurück. Die sind an bestimmte Befehle gebunden ... sonst läuft nichts. das nennt sich dann Query-Object-Model oder Database-Abstraction-Layer also was genau möchtest du von uns, entwickelst du das weiter und brauchst ideen oder wo liegt die Frage ? Bearbeitet 16. Februar 2010 von Aiun Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.