Websiteentwicklung: PHP: Firebird
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'