Artikel als PDF anzeigen

Werbung
ITMAGAZINE
Einheit im Datenbank-Dschungel
von Andreas Ahlenstorf
29. April 2005 - Mit PDO erhält PHP endlich ein konsistentes Interface zu den meistverbreiteten Datenbanken. Während sich Entwickler bei den meisten Scriptsprachen über konsistente Datenbank-Interfaces freuen können,
mit deren Hilfe man bei einem Wechsel der Datenbank schlimmstenfalls die SQL-Abfragen anpassen muss, sieht
es diesbezüglich in der PHP-Welt etwas trister aus: Jede Datenbank-Extension verfügt über eigene Funktionen,
die zum Teil erheblich in ihrem Funktionsumfang differieren und bezüglich Aktualität von «angestaubt»
(ext/mysql) bis hin zu «taufrisch» (ext/mysqli und ext/sqlite) rangieren. Hat man nun auf eine bestimmte
Datenbank wie MySQL gesetzt und möchte beispielsweise auf PostgreSQL umsteigen, müssen nicht nur einige
SQL-Abfragen überarbeitet, sondern auch sämtliche mysql_*()-Funktionen durch ihre pg_*()-Entsprechungen
ersetzt werden.
Alternative zur Alternative
Wollte man dies vermeiden, existierten bislang zwei Ansätze. Eine Möglichkeit bestand darin, einen Wrapper zu
schreiben. Ein Wrapper sorgt für ein einheitliches Interface gegenüber den nativen Extensions und kann sich
noch um die Input-Filterung und das Error-Handling kümmern. Die andere Möglichkeit war der Einsatz eines
Abstraktions-Layers, der über die Funktionalität des Wrappers hinausgeht, indem er versucht, Inkompatibilitäten
zwischen mehreren Datenbanksystemen auszugleichen. Mit PDO, das zum Funktionsumfang von PHP 5.1
gehören soll, steht in Zukunft eine weitere Möglichkeit zur Verfügung.
PDO, das für PHP Data Objects Interface steht, ist eine C-Extension, die von Wez Furlong, Marcus Börger, Ilia
Alshanetsky und Georg Schlossnagle geschrieben wurde. Sie stellt eine einheitliche API für eine Reihe von
spezifischen Datenbanktreibern dar, welche die Brücke zwischen Scriptsprache und Datenbankserver bilden. Die
Ansteuerung der jeweiligen Datenbank erfolgt über einen Data Source Name (DSN), der dem PDO-Konstruktor
übergeben wird:
$db = new PDO('mysql:host= 192.168.32.201;dbname=test');
Möchte man statt MySQL einen MS-SQL-Server verwenden, braucht man nur den DSN zu ändern:
$db = new PDO('mssql:host= 192.168.32.190;dbname=test');
Einfache Anwendung
Das Query-Interface ist angenehm schlank geraten. Dies lässt sich einerseits damit erklären, dass PDO auf die
Pufferung von Daten verzichtet, womit einige Funktionen fehlen, die auf gepufferte Daten angewiesen sind, und
andererseits spezielle Funktionen fehlen, um beispielsweise mehr über den Zustand des Servers in Erfahrung zu
bringen. Beachtenswert ist vor allem für Anwender von MySQL, dass man nach den Entwicklern von PDO
vorzugsweise auf Prepared Statements setzen sollte. Diese vermindern unter anderem die Gefahr von SQL
Injections und können bei einer starken Nutzung gewisser Abfragen für eine bessere
Ausführungsgeschwindigkeit sorgen, da eine Abfrage nur einmal vom Server analysiert werden muss.
$stmt = $db->prepare("INSERT INTO 'test' ('vorname', 'nachname') VALUES (:vorname, :nachname)");
$stmt->bindParam(':vorname', $vorname);
$stmt->bindParam(':nachname', $nachname);
$stmt->execute();
Wie man bereits sehen konnte, verhält sich PDO wie mysqli oder die im Rahmen von PHP 5 neu
hinzugekommenen XML-Extensions als Objekt. Dies ist besonders bei der Fehlerbehandlung praktisch, da man
PDO dazu bewegen kann, Exceptions zu werfen. $db->setAttribute(PDO_ATTR_
ERRMODE, PDO_ERRMODE_
EXCEPTION);
Exceptions sparen die vergleichsweise aufwendige Prüfung der Resultate mit $stmt->errorCode() und
$stmt->errorInfo(), da man die kompletten Datenbankoperationen in try…catch-Blöcke einfassen kann. Summa summarum kann PDO dem geneigten Entwickler die Arbeit einfacher machen und die Entwicklung eines
Datenbank-Wrappers ersparen. Allerdings muss man sich bewusst sein, dass PDO trotz der Fähigkeit, mit einem
einfachen Wechsel der DSN unterschiedliche Datenbanken ansprechen zu können, keinen vollwertigen
Abstraktions-Layer wie AdoDB oder PEAR::DB darstellt. Denn diese versuchen, die unterschiedliche
Funktionsweise der verschiedenen Datenbanksysteme zu vereinheitlichen, und emulieren teilweise fehlende
Funktionen – etwas, wozu PDO weder in der Lage noch gedacht ist.
Copyright by Swiss IT Media 2017 
Herunterladen