Zum Inhalt springen
Der Guide für ein smartes Leben.
Unabhängige Daten mit PHP und PDO

Teil 2: Datenbankabstraktion

Autoren: Redaktion pcmagazin und Tobias Hauser • 2.2.2009 • ca. 3:10 Min

Inhalt
  1. Datenbankabstraktion
  2. Teil 2: Datenbankabstraktion
  3. Teil 3: Datenbankabstraktion

Anschließend geht es an die erste Abfrage. Zentral ist die Klasse PDO. Sie müssen ein Objekt der Klasse erstellen. Im Objekt übergeben Sie vier Parameter, die Datenbank, Nutzername und Passwort sowie die Konfigurationseinstellungen. Verpflichtend ist nur der erste Parameter. Für das erste Erstel...

Anschließend geht es an die erste Abfrage. Zentral ist die Klasse PDO. Sie müssen ein Objekt der Klasse erstellen. Im Objekt übergeben Sie vier Parameter, die Datenbank, Nutzername und Passwort sowie die Konfigurationseinstellungen. Verpflichtend ist nur der erste Parameter. Für das erste Erstellen ist der Konstruktor zuständig (__construct). Für das Anlegen einer Verbindung bietet sich ein try-catch-Konstrukt an, um eventuelle Fehler abzufangen. Die PDO besitzen eine PDOException, die die entsprechende Fehlerausgabe enthält.

$connect = null;
try { $connect = new PDO('mysql:host=
localhost;dbname=internetmagazin,'user', 'password');}
catch (PDOException $error) {
echo 'Ein Fehler trat auf: ' .
$error->getMessage(); }

Ob die Verbindung geklappt hat, können Sie einfach testen, indem Sie das Objekt ausgeben. Es muss sich dabei um ein PDO-Objekt handeln, das noch nichts enthält.

var_dump($connect);

Sollte die Verbindung geklappt haben, können Sie sie jederzeit wieder kappen, indem Sie das PDO-Objekt auf den Wert null zurücksetzen. Dass die Datenbankverbindung abgebaut wird, erledigt der Destruktor.

$connect = null;

Abfrage

Die PDO-Klasse dient zum Aufbau der Verbindung und zum Starten von Abfragen. Daneben gibt es noch eine zweite Klasse, die bei der Abfrage von Bedeutung ist: die Klasse PDOStatement. Sie verarbeitet die Rückgabe und erlaubt mit Ihren Methoden, Inhalte aus der Rückgabe zu extrahieren:

<?php
$connect = null;
try {
$connect = new PDO('mysql:host=
localhost;dbname=internetmagazin','user', 'password');
} catch (PDOException $error) {
echo 'Ein Fehler trat auf: ' .
$error->getMessage(); }
try { $pdostatement = $connect->query
('SELECT id, inhalt, autoren_id FROM artikel');
echo '<pre>';
while ($data = $pdostatement->
fetch()) { var_dump($data);
echo '<br />'; }
echo '</pre>';
} catch (PDOException $error
Statement) {
echo 'Ein Fehler bei der Abfrage
trat auf:' . $errorStatement->getMessage();}
$connect = null;
?>

Hier wird eine einfache SQL-Abfrage per query ausgeführt. Die Rückgabe ist ein PDOStatement, wenn alles klappt. Wenn nicht, liefert die Methode query() den Wert false zurück. Dies könnten Sie noch separat abfangen, der Beispielcode verarbeitet diese Rückgabe nicht.Kommt ein korrektes Ergebnis an, wird dies dann mit der Methode fetch() zeilenweise ausgelesen. Zurückgeliefert wird ein Array mit jeder einzelnen Datenzeile. Den können Sie nun einfach wie auch von anderen Datenbankerweiterungen gewohnt weiterverarbeiten. Hier begnügen wir uns mit einer einfachen var_dump()-Ausgabe.

Datenbankabstraktion mit PHP und PDO
Für PHP 5.0 sind die PDO über PECL verfügbar.
© Archiv

Beim Beispiel handelt es sich um eine Leseoperation. Aber auch fürs Schreiben oder Löschen funktioniert die Verarbeitung analog. Zu dieser einfachen Form gibt es einige Alternativen. Wollen Sie eine Abfrage mehrfach verwenden, setzen Sie die Methode prepare() ein.

$pdostatement = $connect->
prepare('SELECT id, inhalt, autoren_id FROM artikel WHERE autoren_id = 1');

Auch diese Methode liefert ein PDOStatement- Objekt. Allerdings wird die Abfrage noch nicht ausgeführt. Dazu müssen Sie sie erst separat mit der execute()-Methode des PDOStatement-Objekts ausführen.

$pdostatement->execute();

Diese Variante ist eine der nützlichsten Datenbankfunktionalitäten überhaupt, Prepared Statements. Die Vorbereitung hilft allerdings hauptsächlich dann, wenn Sie für Parameter Platzhalter definieren. Nativ unterstützen das nicht alle Datenbanksysteme. Deswegen implementiert das die PDO direkt im Datenbanktreiber - und zwar als einzige Funktion. Die Syntax in der Schnittstelle ist denkbar einfach. Anstelle des Wertes fügen Sie in eine Abfrage einfach einen Platzhalternamen ein, der mit einem Doppelpunkt beginnt.

$pdostatement = $connect->
prepare('SELECT id, inhalt, autoren_id FROM artikel WHERE autoren_id = :autorenid');

Vor dem Aufruf erfolgt dann noch die Bindung an diesen Parameter. Dafür ist die Methode bindParam() zuständig. Sie erhält als ersten Wert den Platzhalternamen des Parameters, als zweiten dann den entsprechenden Wert.

$pdostatement->bindParam
(':autorenid', $autorenid);
$pdostatement->execute();

Hier das vollständige Listing:

<?php
$connect = null;
try { $connect = new
PDO('mysql:host=localhost;dbname=internetmagazin','user', 'password');}
catch (PDOException $error)
{ echo 'Ein Fehler trat auf: ' . $error->getMessage(); }
$autorenid = 1;
try { $pdostatement =
$connect->prepare('SELECTid, inhalt, autoren_id FROM artikel WHERE autoren_id = :autorenid');
$pdostatement->
bindParam(':autorenid', $autorenid);
$pdostatement->execute();
echo '<pre>';
while ($data =
$pdostatement->fetch())
{ var_dump($data); echo '<br />'; } echo '</pre>'; }
catch (PDOException
$errorStatement){
echo 'Ein Fehler bei der Abfrage
trat auf:' . $errorStatement->getMessage(); }
$connect = null;
?>

Eine Alternative zum benannten Platzhalter ist der Platzhalter mit ?. Dabei ist die Reihenfolge der Parameter entscheidend:

$pdostatement = $connect->
prepare('SELECT id, inhalt, autoren_id FROM artikel WHERE autoren_id = ? ');