PHP 5 und SQLite
Datenbankprogrammierung mit SQLite
SQLite – eine einfache Umgebung für Datenbank-Applikationen
PHP 5 und SQLite
PHP 5 wird mit einem neuen und allgemein verfügbaren Datenbanksystem SQLite ausgeliefert, das kein Client-Server-Modell einsetzt. Es ist in Ihre PHP-Anwendung eingebettet und benötigt nur Zugriff auf die Datenbankdateien. Dadurch kann SQLite leichter in andere Anwendungen integriert werden, da es nicht von externen Diensten abhängt. Die Einrichtung einer neuen Datenbank mit SQLite ist einfach und erfordert keinen Sys temadministrator. Die gesamte SQLite-Engine liegt dem PHP-5-Paket bei. Man muss keine zusätzlichen Pakete installieren, um es PHP-Entwicklern zur Verfügung zu stellen. Jedes Shared-Hosting-Paket, das PHP 5 anbietet, verfügt also auch über diese Datenbank.
Die PHP-Erweiterung von SQLite kann sowohl objekt orientiert als auch mit Prozeduren bedient werden. Die objektorientierte Variante benötigt weniger Code und ist in manchen Fällen schneller als mit Prozeduren. Die Tatsache, dass SQLite keinen Serverprozess hat, gehört zwar zu den Stärken, führt aber zu einer Reihen von Schwierigkeiten beim Skalieren: Probleme bei der Sperrung von Daten und gleichzeitigem Zugriff, das Fehlen eines beständigen Cachespeichers für Abfragen und Skalierungsprob leme beim Umgang mit sehr großen Datenvolumen.
In SQLite gibt es zudem keinen unmittelbaren Weg, Binärdaten zu verarbeiten. Um solche in eine SQLite-Datenbank zu schreiben, muss man die Daten zuerst kodieren. Zudem müssen nach dem Einsatz von SELECT die kodierten Binärdaten wieder dekodiert werden.
Die meisten Datenbanksysteme sperren während Transaktionen einzelne Tabellen oder auch nur Zeilen. Wegen seiner Implementierung sperrt SQLite aber beim Einfügen die gesamte Datenbank, wodurch parallele Lese- und Schreibzugriffe drastisch langsamer werden.
Die besten Einsatzgebiete
PHP 5 und SQLite
Die größte Stärke der SQLite-Datenbank besteht darin, dass es ein vollständiges Produkt und perfekt geeignet für Webhosting-Umgebungen ist. Da der SQLite-Client dateibasiert arbeitet, ist für den Datenbankzugriff keine zweite Menge von Berechtigungsnachweisen notwendig. Wenn man Schreibzugriff auf die Datenbankdatei hat, kann man beliebige Änderungen in der Datenbank vornehmen. Hos ting-Unternehmen müssen nur die SQLite-Erweiterung von PHP unterstützen, um den Rest können sich die Kunden kümmern.
Ein Hosting-Provider kann eine Maximalgröße für Datenbanken ebenso wie für andere Daten im Webspace sehr einfach festlegen, weil die SQLite-Datenbank nur aus einer Datei besteht, die Speicherplatz im Webspace des Kunden beansprucht. Es ist also nicht notwendig, unterschiedliche Quota für Webspace und Datenbank festzulegen.
Bei eigenständigen Anwendungen ist die Leistung von SQLite hervorragend. Besonders in Webhosting-Umgebungen, in denen es viele Leseabfragen und wenig Schreibzugriffe gibt, kann SQLite seine Geschwindigkeit voll entfalten. Ein Beispiel für eine solche Anwendung ist ein Weblog, in dem alle Treffer Kommentare aus der Datenbank holen, aber nur wenige Kommentare hinzugefügt werden.
Die PHP-Schnittstelle
PHP 5 und SQLite
Da zum Betreiben von SQLite kein Daemon oder Dienst benötigt wird, besteht das Einrichten einer Datenbank einfach in der Erstellung einer speziell formatierten Datei. Zum Erzeugen einer neuen Datenbank müssen Sie nur versuchen, eine zu öffnen. Wenn die Datenbank nicht existiert, wird eine neue erstellt:
if($dbhandle = sqlite_open($dbfile,0666,$dberror))
Das Handle auf die Datenbank wird in der Variablen $db handle gespeichert. Für alle weiteren Operationen auf der Datenbank muss dieses Handle mit angegeben werden. Anschließend wird in der Variablen $sql die Anweisung zum Erzeugen der Tabelle entries gespeichert.
$sql = 'CREATE TABLE entries (id INTEGER PRIMARY KEY, title, message, author, email, homepage)';
Sollten Sie sich mit anderen Datenbanksystemen auskennen, werden Sie wahrscheinlich bemerken, dass die Typenangaben bei manchen Felddefinitionen der CREATE_
TABLE-Abfragen fehlen. Tatsächlich gibt es in SQLite intern nur zwei Typen: INTEGER für die Speicherung von Zahlen, und etwas anderes, was man in etwa mit dem VARCHAR-Feld aus anderen Datenbanken vergleichen kann.
In SQLite kann man in einem solchen Feld allerdings mehr als 255 Zeichen speichern, was in anderen Datenbanksystemen manchmal nicht geht. Man kann auch ein INTEGER-Feld automatisch inkrementieren, indem man an die Felddefinition den Zusatz PRIMARY KEY anhängt. Das ist natürlich nur für ein Feld pro Tabelle möglich.
Nur mit den erstellten Tabellen bringt die Beispielanwendung noch nicht viel. Daher fügen Sie im nächsten Schritt Daten in Ihre Datenbank ein. Dies können zum Beispiel Einträge aus einem Formular sein. Wurde für jedes Feld ein Wert eingegeben, wird die Datenbank geöffnet und die SQL-Anweisung zum Einfügen des Datensatzes erzeugt:
$sql = "INSERT INTO entries VALUES (NULL,'$title','$message','$author',
'$email','$homepage')";
Für das Feld wird NULL übergeben, damit automatisch ein eindeutiger Wert ermittelt wird. Daraufhin wird die Anweisung ausgeführt und die Datenbank geschlossen.
Einträge anzeigen
PHP 5 und SQLite
Um vorhandene Einträge in der Datenbank abzufragen, wird mittels sqlite_open die Datenbank zuerst geöffnet. Anschließend wird die SQL-Anweisung zum Auslesen aller Datensätze definiert und die Anweisung ausgeführt.
$sql = 'SELECT * FROM entries';
$result = sqlite_query($dbhandle,$sql);
Die Ergebniskennung der Anweisung wird in der Variablen $result gespeichert. Abgesehen von einem anderen Funktionsnamen entspricht dies dem typischen Vorgehen bei MySQL-Datenbanken.
Mit der Anweisung sqlite_num_rows kann die Anzahl der Datensätze in der Ergebnistabelle überprüft werden. Dazu muss der Funktion nur die Ergebniskennung übergeben werden. Ist der Wert größer 0, werden die Datensätze ausgelesen und ausgegeben, andernfalls ein alternativer Text.
Das Auslesen der Datensätze erfolgt analog zu MySQL mit der Anweisung sqlite_fetch_array. Der Funktion wird lediglich die Ergebniskennung übergeben, sie liefert anschließend den nächsten Datensatz als assoziatives Array zurück. Zu beachten ist, dass es keine MySQL-analoge Funktion sqlite_fetch_row gibt.
Bei jedem Aufruf von sqlite_fetch_array wird der Zeiger in der Ergebnistabelle auf den nächsten Datensatz gesetzt. Wurden alle Datensätze ausgelesen, gibt die Funktion false zurück und die Schleife wird beendet. Abschließend wird der Zugriff auf die Datenbank mittels sqlite_close beendet.
Fehlerbehandlung
PHP 5 und SQLite
Die Fehlerbehandlung in SQLite ist etwas gewöhnungsbedürftig, da jede der Abfragefunktionen eine Warnung ausgeben kann. Daher ist es wichtig, den Abfragefunktionen den Silence-Operator @ voranzustellen. Um zu sehen, ob die Abfrage erfolgreich war, muss das Ergebnis der Funktionen auf den Wert FALSE überprüft werden. War sie nicht erfolgreich, können Sie mit Hilfe von sqlite_last_error() und sqlite_error_string() einen Beschreibungstext des Fehlers erhalten. Leider ist dieser Text nicht sehr ausführlich. Der Konstruktor von SQLite könnte auch eine SQLiteException zurückgeben, die Sie selbst abfangen müssen (mit einem try-catch-Block).
Fazit
SQLite kann durchaus eine Alternative zu MySQL sein, je nachdem in welchem Umfeld es eingesetzt wird. Die Datenbank bietet alle Möglichkeiten, die von den meisten Webprogrammierern von MySQL genutzt werden.
Problematisch wird es erst, sobald mehrere Zugriffe parallel auf die Datenbank erfolgen. Zwar ist dies möglich, die Geschwindigkeit sackt jedoch enorm ab. Für kleine Programme wie ein Gästebuch oder eine News-Verwaltung sollte SQLite ausreichen. Sobald es jedoch auf Performance ankommt, ist auf jeden Fall die Verwendung von MySQL anzuraten. Beachten Sie, dass es in SQLite keine Benutzerverwaltung wie unter MySQL gibt. Jeder, der möchte, kann auf die Datenbank zugreifen, solange ihm dies das Betriebssystem ermöglicht.