Websiteentwicklung: PHP: Firebird

Aus Wikibooks

Firebird unter PHP[Bearbeiten]

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.

Voraussetzungen zum Arbeiten mit Firebird unter PHP[Bearbeiten]

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 PHP[Bearbeiten]

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 Recordset[Bearbeiten]

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
}

Sequenzen[Bearbeiten]

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'