
|
PECL Die PHP Extension Community Library stellt PHP-Erweiterungen zur Verfügung, die komplett in C geschrieben sind. |
|
OR-Mapper Objektrelationales-Mapping (ORM) ist eine Methode in der Softwareentwicklung, um in einer Anwendung, die mittels OOP erstellt wurde, Objekte in einer relationalen Datenbank abzulegen. |
|
Doctrine Doctrine ist ein ORM-Framework für PHP5, welches Ähnlichkeiten mit dem für Java gebräuchlichen ORM Hibernate aufweist. |
|
Propel Propel ist ein ORM-Werkzeug für PHP5, das auf dem Apache-Torque-Projekt basiert. |
|
SDK Software Development Kit - Sammlung von Dateien und Programmen, die zur Erstellung von Anwendungen durch Softwareentwickler benötigt werden. |
|
DSN Data Source Name - Eine Datenstruktur ähnlich einer URL, die zur Beschreibung von Zugangsdaten für Datenbanktreiber dient. |
PHP unterstützt von Hause aus diverse DBMS wie beispielsweise Oracle, MySQL, Informix oder SQLite. Was liegt da näher, als auch seine Anwendungen vielfältig einsetzbar und daher unabhängig vom jeweiligen DBMS zu entwickeln. Bisher haben sich Programmierer vor der Entwicklung Gedanken zur einzusetzenden Datenbank gemacht. Daraufhin wurden in der Anwendung die von PHP zur Verfügung gestellten Funktionen für diese Datenbank genutzt.
|
||
|
||
|
||
| ||
|
||
|
Ab PHP 5.1 wird die PDO-Erweiterung standardmäßig mit ausgeliefert und stellt eine einheitliche Schnittstelle für Datenbanken bereit. Das bedeutet, dass die für den Datenbankzugriff eingesetzten Funktionen bestehen bleiben, auch wenn sich das unter der Anwendung befindliche DBMS ändert. Während für die bisherige Programmierung Funktionen wie mysql_connect und mysql_query für MySQL oder sqlite_open und sqlite_exec für SQLite oder ifx_connect und ifx_query für Informix benutzt wurden, wird bei Verwendung von PDO auf eine objektorientierte, einheitliche Schnittstelle zurückgegriffen, in der alle Funktionalitäten gekapselt sind. Die PDO-Schnittstelle ist jedoch nicht mit einem OR-Mapper, wie z. B. Doctrine oder Propel, zu verwechseln, die nicht in diesem Artikel behandelt werden. PDO stellt lediglich die Schnittstelle zur Datenbank dar und ist nicht dafür verantwortlich, Objekte in Tabellen zu persistieren oder eigenständig SQL-Befehle zu generieren. Hierzu wiederum sind die angesprochenen Bibliotheken sehr nützlich und durchaus zu empfehlen. Diese nutzen intern wiederum die PDO-Schnittstelle als Datenbankabstraktionsschicht.
Die PHP Data Objects sind seit PHP 5.0 als PECL-Erweiterung verfügbar und ab PHP 5.1 fester Bestandteil der Distribution. Sie können über die Ausgabe von phpinfo() feststellen, ob und für welche Datenbanksysteme die PDO-Erweiterung in Ihrem System aktiviert ist (siehe Abbildung 1). Standardmäßig ist die PDO-Erweiterung für SQLite integriert. Benötigen Sie PDO z. B. für MySQL, so ist unter Windows die entsprechende Dynamic Link Library (DLL) in der php.ini zu aktivieren. Unter Linux muss dazu jedoch PHP mit dem Schalter --with-pdo-mysql kompiliert werden, damit die entsprechende PDO-Erweiterung für MySQL eingebunden wird.
Analog zur oben Art der Kompilierung können auch folgende PDO-Erweiterungen in PHP eingebunden werden, da sie direkt mit ausgeliefert werden:
Seit PHP 5.2 stehen die bekannten Informix-Funktionen ifx_* nicht mehr zur Verfügung. Der Zugriff kann nur noch über die PDO-Schnittstelle erfolgen. Die PDO-Erweiterung für Informix muss für Linux zunächst unter http://propel.phpdb.org/ heruntergeladen, gegen ein installiertes Informix Software Development Kit (SDK) kompiliert und in PHP eingebunden werden. Für Windows ist die Installation schwieriger, denn ein Kompilieren kann hier oft nicht durchgeführt werden. Die International Informix User Group bietet (ohne Gewähr) eine vorkompilierte pdo_informix.dll zum Download an [1].In aktuellen XAMPP-Paketen wird auch eine entsprechende Bibliothek mit ausgeliefert.
Die Verbindung zu einer Datenbank erfolgt bei PDO durch das Instanzieren der PDO-Basisklasse mit einem entsprechend parametrisierten Konstruktor. In Abbildung 2 ist der Verbindungsaufbau zu einer MySQL-Datenbank dargestellt. Als erster Parameter an den Konstruktor wird der Data Source Name (DSN) angegeben, der alle notwendigen Informationen enthält, wie u. a. den Hostnamen, den Datenbanknamen und -port.
Der zweite Parameter ist der Benutzername, mit dem man sich bei der Datenbank anmeldet. Der dritte Parameter ist das zugehörige Kennwort. Einige PDO-Erweiterungen, wie z. B. diejenige für SQLite und ODBC, benötigen keine Angabe von Benutzername und Kennwort als Parameter des Konstruktors. Hier genügt der DSN mit allen notwendigen Informationen, wie z. B. dem Pfad zur SQLite-Datenbankdatei oder der bei ODBC zu nutzende Treiber. Hier können u. a. auch Login-Informationen hinterlegt werden. Der genaue Aufbau und die möglichen Parameter eines DSN für eine spezielle PDO-Implementierung kann auch in der jeweiligen Beschreibung auf http://www.php.net/PDO/ nachgelesen werden.
Der Verbindungsabbau geschieht im Normalfall beim Beenden des PHP-Skripts. Eine Verbindung kann auch manuell beendet werden, indem die Instanz des PDO-Objekts zerstört wird, d. h. explizit auf NULL gesetzt wird, wie es in Abbildung 2 zu sehen ist.
Nachdem eine Verbindung zur Datenbank aufgebaut wurde, können wir nun Daten in die Tabellen schreiben. Dazu nutzen wir eine Tabelle namen und füllen diese mit Werten. (siehe Abbildung 3). In Abbildung 4 sind die Code-Zeilen dargestellt, die einen Datensatz in die Tabelle schreiben. Hier bedienen wir uns eines PDOStatement-Objekts, das durch den Methodenaufruf $dbh->prepare($sql) erzeugt wird. In der Abbildung sind zwei Möglichkeiten aufgezeigt, die durch das Fragezeichen definierten Parameter des Prepared Statement mit Werten zu füllen. Zum einen kann die bindParam()-Methode des Objekts genutzt werden. Zum anderen können die Werte direkt als Array an die execute()-Methode übergeben werden. Es werden zwei neue Datensätze in die Tabelle eingefügt.
In anspruchsvolleren Anwendungen spielt oft die Transaktionssicherheit bei der Entwicklung eine große Rolle. Tritt bei der Bearbeitung von Datensätzen, z. B. Einfügen, Aktualisieren oder Löschen, ein Fehler auf, so sollten die Änderungen nicht in die Datenbank geschrieben werden, um inkonsistente Datensätze zu vermeiden. PDO ermöglicht die Nutzung von Transaktionen, sofern diese durch das angesprochene Datenbanksystem unterstützt werden. Vor Beginn der Bearbeitung von Datensätzen erfolgt ein Aufruf der Methode $dbh->beginTransaction(), um eine Transaktion einzuleiten. Sind bei der Bearbeitung keine Fehler aufgetreten, können die Änderungen mit Hilfe der Methode $dbh->commit() in die Datenbank geschrieben werden. Im Fehlerfall wird ein Rollback mit der Methode $dbh->rollback() durchgeführt und alle Änderungen verworfen, die während der Transaktion vorgenommen wurden.
Die Vorgehensweise bei der Abfrage von Daten ist nahezu identisch mit der Änderung und ist in Abbildung 5 aufgeführt. Zunächst weisen wir einer Variable $sql das gewünschte SELECT-Statement zu. Daraufhin wird ein PDOStatement-Objekt erzeugt, das die Abfrage mittels $stmt->execute() an die Datenbank sendet. Jetzt bedienen wir uns der fetch()-Methode des PDOStatement-Objekts, um die zurückgelieferten Daten zu verarbeiten. Die hier verwendete Konstante PDO::FETCH_ASSOC definiert das Aussehen des Arrays $row. In diesem Fall wird ein assoziatives Array erzeugt, das die Spaltennamen der Tabelle als Schlüssel besitzt, denen die Werte zugeordnet sind. Die while-Schleife wird genutzt, weil nicht nur der erste Ergebnisdatensatz, sondern alle, die von dem SELECT-Statement zurückgeliefert werden, verarbeitet werden soll. In unserem einfachen Fall besteht die Verarbeitung nur aus der Ausgabe des $row-Arrays mit den Daten.
Eine weitere, sehr nützliche Möglichkeit ist die Zuweisung eines Datensatzes zu einem Objekt. Dies wird in Abbildung 6 verdeutlicht. Zunächst erstellen wir eine Klasse Person, deren Attribute den Spaltennamen der Tabelle entsprechen. Danach verwenden wir die Methode $stmt->fetchObject() und übergeben als Parameter den Namen der Klassen, die die Werte aus der Tabelle aufnehmen soll. Auf diese Weise kann die Verarbeitung der Ergebnisdatensätze objektorientiert stattfinden, indem z. B. die Methode sagHallo() der Klasse aufgerufen wird. Diese kann direkt auf die Klassenvariablen zugreifen.
Diese Einführung in PDO zeigt, wie einfach die Handhabung dieser Schnittstelle ist. Dieser Artikel kann bei Weitem nicht alle Details und Raffinessen aufzeigen, so dass wir zusätzlich auf die Online-Dokumentation unter http://www.php.net/PDO/ hinweisen möchten.
PDO gibt dem Entwickler die Flexibilität, einen Datenbanktausch ohne große Mühe zu bewerkstelligen. Die komplette Anwendung muss nicht mehr an die neue Datenbank angepasst werden. Lediglich beim Verbindungsaufbau muss der DSN verändert werden.
Voraussetzung ist die Einbindung der datenbankspezifischen PDO-Erweiterung in PHP. Diese Erweiterungen sind nicht in PHP, sondern komplett in C geschrieben und somit um einiges performanter als PHP-eigene Schnittstellen.
Die vielfältige Möglichkeit, Daten abzufragen und diese sogar in Objekte zu transferieren, bietet dem Entwickler viel Freiraum.
Lars Hendrik Korte (info@ordix.de).