ConnectionManager

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.

1. Konfiguration

Der ConnectionManager fungiert als Factory für konkrete Implementierungen eines Datenbanktreibers. Um den gewünschte Treiber laden zu können, muss dieser zunächst konfiguriert werden. Die geschieht in der Konfigurationsdatei
Code
/config/core/database/{CONTEXT}/{ENVIRONMENT}_connections.ini
Details zu Konfigurationsdateien können dem Kapitel Konfiguration entnommen werden. Die Konfigurationsdatei enthält je eine Sektion für einen Treiber:
APF-Konfiguration
[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.

Der Debug-Modus kann dazu genutzt werden, das aktuell ausgeführte Statement auszugeben. Alternativ dazu kann der optionale Parameter $logStatement der Methoden executeStatement() und executeTextStatement() genutzt werden um das aktuell ausgeführte Statement in eine Log-Datei zu schreiben. Details zur Funktion können der API-Dokumentation entnommen werden.

2. Anwendung

Um den ConnectionManager einsetzen zu können muss dieser zunächst per
PHP-Code
import('core::database','ConnectionManager');
eingebunden werden. Anschließend kann per
PHP-Code
$cM = &$this->__getServiceObject('core::database','ConnectionManager'); $driver = &$cM->getConnection('Sektionsname');

eine Instanz eines Datenbank-Treibers erzeugt werden.

3. Erweiterung

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.

4. Vorhandene Treiberschichten

Das Framework liefert zwei Treiberschichten mit:

  • MySQLx: MySQL-Treiberschicht. Setzt auf die mysql_*-Funktionen auf
  • SQLite: SQLite-Treiberschicht. Setzt auf die sqlite_*-Funktionen. Hier ist PHP > 5.0.0 notwendig!
  • MySQLi: MySQLi-Treiberschicht. Setzt auf die mysqli_*-Funktionen auf

4.1. MySQL-Treiberschicht

Um eine Instanz des MySQL-Treibers erstellen zu können, ist folgende Konfiguration notwendig:

APF-Konfiguration
[MySQL] DB.Host = "host" DB.User = "user" DB.Pass = "pass" DB.Name = "name" DB.Type = "MySQLx" [DB.DebugMode = "true|false"] [DB.Charset = ""] [DB.Collation = ""]
Die Parameter DB.Charset und DB.Collation dienen dazu, den Zeichensatz und die Zeichenbehandlung der MySQL-Verbindung zu definieren. Mit dem Parameter DB.Charset werden die MySQL-Variablen
  • character_set_client
  • character_set_connection
  • character_set_results
gesetzt, DB.Collation beeinflusst
  • collation_connection
  • collation_database
Die beiden Parameter sind optional und können bei Bedarf auch wechselseitig gesetzt werden, das Vorhandensein beider ist nicht erforderlich.
Details zu den verfügbaren Werten für die Konfiguration findet sich in der MySQL-Dokumentation im Kapitel Connection Character Sets and Collations (MySQL 5.0).
Anschließend kann die Treiber-Instanz mit den Code-Zeilen
PHP-Code
$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.

4.2. SQLite-Treiberschicht

Eine SQLite Treiberschicht kann mit dem Konfigurationseintrag

APF-Konfiguration
[SQLite] DB.Name = "/path/to/my/database.sqlite" DB.Type = "SQLite" DB.DebugMode = "true|false"
und den Code-Zeilen
PHP-Code
$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.

4.3. MySQLi-Treiberschicht

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:

APF-Konfiguration
[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:

  • executeTextBindStatement()
  • executeBindStatement()

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:

PHP-Code
// 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

Code
/apps/config/my/module/{CONTEXT}/{ENVIRONMENT}_notepad_entries.sql

die übergebenen Parameter in der Form

Code
SELECT * FROM notepad WHERE save_date BETWEEN [date_from] AND [date_until]

enthält.

Kommentare

Bitte geben Sie Ihren Kommentar hier ein. Füllen Sie alle mit * gekennzeichneten Felder vollständig und korrekt aus. Um zum Artikel zurückzukehren klicken sie bitte hier. Zur Formatierung des Textes können folgende BBCode-ähnliche die Zeichen verwendet werden:
  • [b]..[/b]: fett
  • [i]..[/i]: kursiv
  • [u]..[/u]: unterstrichen
Hinweis: Formatierungszeichen in Name und E-Mail-Adresse werden nicht akzeptiert.
Name:*
E-Mail:*

Kommentar:


Bestätigungscode:*

CAPTCHA