Zweck des ConnectionManagers ist es, eine Konvention zu definieren, wie die Konfiguration und Implementierung einer Datenbank-Zugriffsschnittstelle gestaltet sein soll. Idealerweise ermöglicht diese Vorgehensweise einen einfachen Austausch einer Treiberschicht gegen eine andere um von einer Datenbank zur anderen zu wechseln.
Trotz, dass dieser Ansatz hinsichtlich der Unterschiede zwischen Datenbanken sehr ambitioniert ist, vereinheitlicht er dennoch die API und schafft ein gemeinsames Verständnis für den Zugriff der Datenschicht einer Applikation auf die Datenbank-Treiberschicht.
/config/core/database/{CONTEXT}/{ENVIRONMENT}_connections.ini[Sektionsname]
DB.Host = ""
DB.User = ""
DB.Pass = ""
DB.Name = ""
[DB.DebugMode = "true|false"]Der Sektionsname dient als Referenz für die Erstellung der Treiber-Instanz, DB.Host beinhaltet den Hostnamen des Datenbank-Server, DB.User und DB.Pass die Authentifizierungsdaten und DB.Name benennt die zu verwendende Datenbank. DB.Type dient zur Definition des zur verwendenen Treibers und DB.DebugMode entscheidet, ob der Debug-Modus des Treibers aktiviert werden soll oder nicht.
import('core::database','ConnectionManager');$cM = &$this->__getServiceObject('core::database','ConnectionManager');
$driver = &$cM->getConnection('Sektionsname');eine Instanz eines Datenbank-Treibers erzeugt werden.
Gemäß der Definition der abstrakten Klasse AbstractDatabaseHandler können weitere Datenbank-Abstraktions-Klassen hinzugefügt werden. Um diese mit dem ConnectionManager verwenden zu können, müssen diese im Namespace core::database abgelegt werden und von der Klasse AbstractDatabaseHandler ableiten.
Das Framework liefert zwei Treiberschichten mit:
Um eine Instanz des MySQL-Treibers erstellen zu können, ist folgende Konfiguration notwendig:
[MySQL]
DB.Host = "host"
DB.User = "user"
DB.Pass = "pass"
DB.Name = "name"
DB.Type = "MySQLx"
[DB.DebugMode = "true|false"]
[DB.Charset = ""]
[DB.Collation = ""]$cM = &$this->__getServiceObject('core::database','ConnectionManager');
$MySQL = &$cM->getConnection('MySQL');erzeugt werden. Die Treiberschicht wird aus Performance-Gründen dabei immer als Singleton-Objekt erstellt.
Eine SQLite Treiberschicht kann mit dem Konfigurationseintrag
[SQLite]
DB.Name = "/path/to/my/database.sqlite"
DB.Type = "SQLite"
DB.DebugMode = "true|false"$cM = &$this->__getServiceObject('core::database','ConnectionManager');
$SQLite = &$cM->getConnection('SQLite');instanziiert werden. Bitte beachten Sie, dass im Fall von SQLite Host, User und Passwort nicht konfiguriert werden müssen, da SQLite eine integrierte Datenbank-Engine ist.
Der MySQLi-Treiber ist weitestgehend identisch mit der Implementierung des MySQLx-Treibers. Er unterstützt das Ausführen von dynamisch zusammengesetzten Statements und Statements, die in SQL-Dateien abgelegt sind.
Um eine Instanz des MySQLi-Treibers erstellen zu können, ist folgende Konfiguration notwendig:
[MySQLi]
DB.Host = "host"
DB.User = "user"
DB.Pass = "pass"
DB.Name = "name"
DB.Type = "MySQLi"
[DB.DebugMode = "true|false"]
[DB.Charset = ""]
[DB.Collation = ""]Für die Konfiguration des Zeichensatz und der Collation gelten die selben Bedingungen wie für eine MySQLx-Connection.
Über die Funktion des MySQLx-Treibers hinaus implementiert er Methoden, die es erlauben, Statements mit Bind-Parametern gegen die Datenbank auszuführen. Diese sind:
Mit executeTextBindStatement() kann ein Statement, das - analog zu executeTextStatement() - als String übergeben wurde gegen die Datenbank ausgeführt werden. Als zweiten Parameter erwartet es die Werte der Bind-Parameter.
Die Methode executeBindStatement() führt ein Statement aus, das in einer SQL-Datei abgelegt wurde und reichert dieses mit den im Aufruf übergebenen Parametern an. Da die Implementierung der Bind-Parameter für MySQL-Datenbanken eine genaue Beachtung der Reihenfolge der Bind-Parameter voraussetzt, wurde in der Implementierung eine automatische Re-Sortierung eingeführt, die dafür sort, dass die Zuordnung der Parameter des Methoden-Aufrufs zur Definition der Parameter in der SQL-Datei passt.
Für die Nutzung der Methode executeTextBindStatement() steht die Funktion fetchBindResult() zur Verfügung. Diese holt analog zu fetchData() die gewünschte Ergebnismenge ab.
Die folgende Code-Box zweigt Anwendungsbeispiele für den Umgang mit Bind-Statements:
// retrieve db connection
$cm = &$this->__getServiceObject('core::database','ConnectionManager');
$conn = $cm->getConnection('MySQLi');
// execute textual statement with bind params
$data = $conn->executeTextBindStatement(
'SELECT * FROM ent_user_2 WHERE FirstName LIKE ?',
array('Christian')
);
// execute statement within an sql file with bind params
$data = $conn->executeBindStatement(
'my::module',
'notepad_entries',
array('date_from' => '2009-03-20 00:00:00','date_until' => '2010-04-10 00:00:00')
);Die Ausführung der letzten Methode setzt voraus, dass eine SQL-Datei unter
/apps/config/my/module/{CONTEXT}/{ENVIRONMENT}_notepad_entries.sqldie übergebenen Parameter in der Form
SELECT *
FROM notepad
WHERE
save_date BETWEEN [date_from] AND [date_until]enthält.