Websiteentwicklung: PHP: Firebird

Firebird unter PHPBearbeiten

Firebird ist ein quelloffenes, relationales Datenbanksystem, das als Fork aus Borlands Datenbanksystem Interbase hervorging. Es beherrscht ACID-kompatible Transaktionen, BLOBs, Sequenzen, Trigger und kann ohne ODBC oder sonstige Zwischenschichten von PHP angesprochen werden. Somit ist es wie geschaffen fuer ein breites Feld an Einsatzzwecken.

Hinweis: Dieser Artikel bezieht sich auf einen in einer Linux-Umgebung laufenden PHP-Interpreter.

Vorraussetzungen zum Arbeiten mit Firebird unter PHPBearbeiten

Die erste Voraussetzung fuer das Arbeiten mit Firebird unter PHP ist ein vorhandener und funktionierender Firebird-Server mit mindestens einem Datenbankschema und einem eingerichteten User. Dokumentationen und Tutorials fuer die Installation des Servers finden sich auf der Firebird-Website; alternativ gibt es dazu ein gutes und kurzes englischsprachiges Tutorial auf debianhelp.co.uk. Neben dem eigentlichen Server wird das PHP-Modul interbase benoetigt. Dieses laesst sich fuer gewoehnlich komfortabel ueber den von Ihrer Distribution eingesetzten Paketmanager installieren. aptitude/apt-get kennen das Interbase-Modul beispielsweise als php5-interbase:

sudo apt-get install php5-interbase

Wenn diese Kriterien erfuellt sind, braucht PHP im jeweiligen Skript eine Verbindung zur Firebird-Datenbank. Diese Verbindung werden wir im folgenden Schritt aufbauen. Jede Funktion, die das Modul Interbase zur Verfuegung stellt, beginnt mit ibase_. Dieser Praefix ist eine Referenz auf die oben erwaehnte, aeltere, Interbase-Datenbank, von der Firebird abstammt.

Um eine Verbindung aufzubauen nutzen wir das Kommando ibase_connect. Es erwartet vier Parameter: Einen Connectionstring, der den Hostname und den Pfad zur Datenbankdatei angibt, einen Usernamen, ein Passwort, und einen String, der das Encoding angibt. Der Connectionstring ist folgendermassen aufgebaut: host:/pfad/zur/datenbank.fdb Wenn wir davon ausgehen, dass der Datenbankserver, den wir ansprechen wollen auf demselben Server liegt, wie unsere PHP-Umbebung und davon, dass die Datenbankdatei, auf der wir arbeiten wollen in /var/lib/firebird/2.5/data/testdatenbank.fdb liegt, und wir bereits einen User testuser mit dem Passwort testpassword angelegt haben, so wuerden wir die Datenbankverbindung wie folgt aufbauen:

$handle = ibase_connect('localhost:/var/lib/firebird/2.5/data/testdatenbank.fdb','testuser','testpassword','UTF-8');

Nach dem Ausfuehren dieses Statements finden wir in $handle ein Handle auf die Datenbankverbindung. Wir werden es in Zukunft ibase_-Operationen mitgeben, die auf dieser Datenbankverbindung arbeiten sollen.

Firebird abfragen unter PHPBearbeiten

Firebird beherrscht grundsaetzlich zwei Mechanismen um Abfragen zu verarbeiten: Den simplen ibase_query und kompilierte Statements via ibase_prepare und ibase_execute. Wenn ein Statement nur einmal ausgefuehrt werden soll, genugt ibase_query. Soll jedoch ein Statement mehrmals mit unterschiedlichen Parametern ausgefuehrt werden, so empfiehlt es sich, den ibase_prepare-Mechanismus zu nutzen um ein performanteres Skript zu erhalten. Betrachten wir zunaechst die Methode ibase_query. Ein typischer Aufruf koennte beispielsweise so aussehen (Ich gehe davon aus, dass wir in $handle mit ibase_connect eine valide Verbindung aufgebaut haben):

$result = ibase_query($handle,"SELECT * FROM Testtabelle;");

In $result ist nun das Ergebnis der Abfrage gespeichert. Es ist eine Liste aus 0-n Datensaetzen, aus der wir nun die einzelnen Datensaetze extrahieren koennen. Dazu spaeter mehr. Betrachten wir nun die Abfrage mittels prepare/execute:

$statement = ibase_prepare($handle,"SELECT * FROM Testtabelle;");
$result = ibase_execute($statement);

Da eine Abrage mit prepare/execute ohne Parameter praktisch keinen Sinn ergibt, folgen nun zwei Beispiele fuer Abfragen mit Parametern.

Query:

$result = ibase_query($handle,"SELECT * FROM Testtabelle WHERE Feld1 = ?;", 'testwert');

Prepare/Execute:

$statement = ibase_prepare($handle,"SELECT * FROM Testtabelle WHERE Feld1 = ?;");
$result = ibase_execute($statement, 'testwert');

Wie wir sehen, nehmen die Funktionen ibase_execute und ibase_query die Parameter fuer das Statement einfach zusaetzlich als Uebergabeparameter an.

Extrahieren von Daten aus dem RecordsetBearbeiten

Um tatsaechlich in PHP verwendbare Daten aus dem Recordset zu Gewinnen, stellt interbase drei Funktionen zur Verfuegung: ibase_fetch_object, ibase_fetch_assoc, ibase_fetch_row. In den folgenden Beispielen gehe ich davon aus, dass bereits ein wie oben beschriebenes $result zur Verfuegung steht. ibase_fetch_object erzeugt ein PHP-Objekt aus einem Datensatz:

$object = ibase_fetch_object($result);
$a = $object->Feld1;
echo $a; // $a ist nun der Wert des Feldes "Feld1" im aktuellen Datensatz der Tabelle "Testtabelle"

ibase_fetch_assoc erzeugt ein assoziatives Array aus einem Datensatz:

$array = ibase_fetch_assoc($result);
$a = $array['Feld1'];
echo $a; // $a ist nun der Wert des Feldes "Feld1" im aktuellen Datensatz der Tabelle "Testtabelle"

ibase_fetch_row erzeugt ein einfaches Array aus einem Datensatz:

$array = ibase_fetch_row($result);
$a = $array[0];
echo $a; // $a ist nun der Wert des Feldes "Feld1" im aktuellen Datensatz der Tabelle "Testtabelle"

Alle drei genannten Methoden inkrementieren den internen Datensatz-Pointer des Resultsets. Und geben FALSE zurueck, falls keine Datensaetze mehr verfuegbar sein sollten. Das hat zur Folge, dass wir Abfrageergebnisse sehr einfach in Schleifen bearbeiten koennen:

while($object = ibase_fetch_object($result)){
     echo $object->Field1; //mache irgendwas mit $object
}

SequenzenBearbeiten

Firebird unterstuetzt Sequenzen. Squenzen sind essentiell um beispielsweise fortlaufende IDs fuer Datensaetze zu generieren. Das Interbase-Modul unterstuetzt hierfuer die Funktion ibase_gen_id, die eine Sequenz um 1 inkrementiert und deren neuen Wert zurueckgibt. Als Parameter erwartet sie den Bezeichner der Sequenz. In der Praxis sieht das so aus:

$id = ibase_gen_id('Testsequenz');
echo $id;  // $id enthaelt den neuen um 1 inkrementierten Wert der Sequenz 'Testsequenz'

Mit ibase_gen_id laesst sich eine Sequenz auch um einen beliebigen Integerwert hochzaehlen. Das sieht so aus:

$id = ibase_gen_id('Testsequenz',5);
echo $id;  // $id enthaelt den neuen um 5 inkrementierten Wert der Sequenz 'Testsequenz'