Datenbank-Alternative SQLite
Klein, kompakt und dateibasiert - mit diesen Vorzügen glänzt SQLite. Dazu kommt die in PHP integrierte API, die den Zugriff leicht macht. Wir zeigen Ihnen den Einsatz von SQLite.

- Datenbank-Alternative SQLite
- Teil 2: Datenbank-Alternative SQLite
SQLite ist eine dateibasierte Datenbank. Im Grunde handelt es sich bei (SQLite um eine C-Bibliothek, deren großer Erfolg mehreren Tatsachen zu verdanken ist. Der größte Vorteil ist sicherlich die geringe Größe. Dazu kommt, dass SQLite trotz der geringen Größe alle Möglichkeiten einer ausg...
SQLite ist eine dateibasierte Datenbank. Im Grunde handelt es sich bei (SQLite um eine C-Bibliothek, deren großer Erfolg mehreren Tatsachen zu verdanken ist. Der größte Vorteil ist sicherlich die geringe Größe. Dazu kommt, dass SQLite trotz der geringen Größe alle Möglichkeiten einer ausgewachsenen Datenbank bietet. Die SQLite-Erweiterung von PHP ist beispielsweise unter 300 KByte groß und beherrscht alle nötigen SQL-Funktionen. Deswegen setzt Adobe beispielsweise bei AIR, der Flash-Player-Integration für den Desktop, auf SQLite zum Speichern von lokalen Daten.
Dies ist sicherlich auch ein Grund, warum SQLite vom Mozilla-Projekt für Cookies und andere Browser-relevante Informationen verwendet wird. Das Mozilla-Projekt hält auch eine Erweiterung für SQLite- Datenbanken bereit: den SQLite Manager. Im Gegensatz zum bekannten phpMy- Admin für MySQL handelt es sich hierbei um eine Firefox-Erweiterung. Sie finden sie auf der offiziellen Add-ons-Site von Mozilla.
Wenn Sie den Manager über das Firefox-Menü Extras starten, müssen Sie zuerst eine Datenbank auswählen. Rechts oben finden Sie ein Auswahlmenü, das alle wichtigen Firefox-Datenbanken enthält. Dort können Sie sich einfach mal umsehen.
Voraussetzungen
Den SQL-Manager benötigen Sie beim Einsatz von SQLite mit PHP allerdings nicht. PHP bietet eine vollständige API mit allen notwendigen Funktionen. Und das Beste: SQLite wird bei PHP 5 gleich mitinstalliert. Über phpinfo() können Sie prüfen, ob die Installation geklappt hat. Unter Windows müssen Sie je nach PHP-Version oder Hoster- Einstellung eventuell noch die Erweiterung in der php.ini aktivieren. Entfernen Sie dazu den Strichpunkt vor:
extension=php_sqlite.dll
oder schreiben Sie direkt diese Zeile in den Extension-Abschnitt der php.ini. Die offizielle Dokumentation zur SQLite-Erweiterung finden Sie unter .
Datenbank anlegen
SQLite lässt sich also vollständig über PHP steuern. Wenn Sie eine Datenbank öffnen, wird automatisch getestet, ob bereits eine existiert. In diesem Artikel kommt eine einfache Kontaktformularverwaltung als Beispiel zum Einsatz. Ein PHP-Skript sorgt dafür, dass die Datenbank anfänglich initialisiert wird.
SQLite bietet grundsätzlich zwei Zugriffsarten, objektorientiert und per Funktion. Um eine neue Datenbank anzulegen, instanziieren Sie also entweder ein SQLiteDatabase-Objekt oder Sie verwenden sqlite_open(). Das folgende Beispiel setzt die OOP-Variante ein. Der Wechsel ist einfach: Die Bestandteile der Funktionsnamen werden per Unterstrich getrennt und haben ein sqlite vorangestellt, die Methodennamen bei der OOP-Variante werden mit Kleinbuchstaben begonnen und dann die Bestandteile mit Großbuchstaben getrennt.
Beim Erstellen einer neuen Datenbank müssen Sie mehrere Dinge entscheiden. Wichtig ist zum einen die Wahl des Speicherorts. Dieser sollte gegen das direkte Herunterladen der Datenbank gesichert sein. Dazu gibt es mehrere Ansätze: Sie verstecken die Datenbank außerhalb des Webroots oder Sie verhindern auf Seiten des Webservers, dass Datenbank-Dateien heruntergeladen werden.
Hierfür ist die Dateiendung wichtig. Diese wird normalerweise .sqlite oder .db lauten. Der zweite Parameter beim Anlegen der Datenbank gibt den Modus an. Er wird aktuell noch nicht verwendet, könnte aber in zukünftigen Versionen steuern, dass nur Lesezugriff erlaubt ist. Als dritter Parameter kommt eine Fehlervariable zum Einsatz. Durch eine zusätzliche Prüfung können Sie als Information noch mit anfügen, woran das Problem vermutlich lag:
$db = new SQLiteDatabase
('kontaktdaten.sqlite', 0666, $error);
if (!$db) {
$error = (file_exists('kontaktdaten.
sqlite')) ? 'Datenbankdatei lässt sich nicht öffnen: ' . $error : 'Datenbankdatei lässt sich nicht erstellen: ' . $error;
die($error);
}
Diesen Code verpackt die Beispielanwendung in eine Klasse CreateDb, die eine eigene Datei CreateDb.php erhält. Sie muss am Anfang zum Erstellen der Datenbank mit Startwerten aufgerufen werden.
Nun zum Aufbau der Beispielanwendung: Wir zeigen den Einsatz von SQLite am Beispiel einer Anwendung zum Speichern von Formularinhalten. Die Kontaktformulare werden in einer Tabelle forms abgelegt. Dies hat den Vorteil, dass man Redakteuren über ein Backend die Möglichkeit geben kann, eigene Formulare anzulegen. Dies lohnt sich bei sehr kontaktintensiven Websites und wird von einigen CMS-Systemen auch schon intern geboten.
Die hier angegebenen Informationen sind nur eine Basisvariante - aktuell auch nur mit einem Formular. Das kann man natürlich noch beliebig erweitern:
$query = 'CREATE TABLE forms (form_
id integer, form_name text, email_to text, PRIMARY KEY (form_id)); INSERT INTO forms VALUES (1, "form1", "th@hauser-wenz.de");';
Eine zugehörige Tabelle forms_fields enthält die Formularfelder. Für jedes Feld wird das zugehörige Formular bestimmt. Außerdem erhält jedes Feld einen Typ. Der Typ wird dann für die Prüfung verwendet. Das Feld name definiert den Formularnamen. Er wird auch als Identifikator für PHP verwendet. value gibt einen Standardwert an. In der einfachen Form wird das Label mit dem Namen befüllt. Aber selbstverständlich wäre dafür auch noch ein eigenes Textfeld denkbar.
$query .= 'CREATE TABLE forms_fields
(field_id integer, form_id integer, fieldtype_id integer, name text, value text, PRIMARY KEY (field_id)); INSERT INTO forms_fields VALUES (1, 1, 1, "PLZ", "00000"); INSERT INTO forms_fields VALUES (2, 1, 2, "Wohnort", "Ihr Wohnort");';
Für die Erstellung und Validierung wird jedem der Felder ein Typ zugeordnet, der wiederum einen regulären Ausdruck enthält, gegen den validiert werden kann. In dieser Tabelle könnten auch andere Informationen abgelegt werden, beispielsweise, ob bestimmte Felder optional sind.
$query .= 'CREATE TABLE forms_
fieldtypes (fieldtype_id integer, type text, validation_regexp text, PRIMARY KEY (fieldtype_id)); INSERT INTO forms_fieldtypes VALUES (1, "plz", "\d{5}");INSERT INTO forms_fieldtypes VALUES (2, "text", "\w{2}.*");';
Zum Speichern der Daten wird eine einzige Tabelle eingesetzt. Dort landen die Daten in serialisierter Form als JSON-Objekt
$query .= 'CREATE TABLE forms_
sended_data (form_sended_id integer, form_id integer, ip text, date text, content text, PRIMARY KEY (form_sended_id));';
Interessant ist hier, welche Datentypen SQLite unterstützt. Einen Überblick gibt die offizielle Doku unter . Wenn die Abfrage fertig zusammengebaut ist, müssen Sie sie nur noch absenden:
$db->queryExec($query);
Zum Abschicken von Abfragen bietet SQLite zwei Methoden: query() und queryExec(). query() erwartet eine Rückgabe, funktioniert aber auch mit den hier gezeigten Statements, die nichts zurückliefern. Performanter ist hier allerdings queryExec(), das keine Rückgabe liefert. Allerdings erhalten Sie mit queryExec() einen Wahrheitswert, ob die Operation geklappt hat.
Hier der vollständige Code der Klasse:
<?php
class CreateDb {
function __construct() {
$db = new SQLiteDatabase
('kontaktdaten.sqlite', 0666, $error);
if (!$db) {
$error = (file_exists
('kontaktdaten.sqlite')) ? 'Datenbankdatei lässt sich nicht öffnen: ' . $error : 'Datenbankdatei lässt sich nicht erstellen: ' . $error;
die($error);
}
$query = 'CREATE TABLE forms
(form_id int, form_name text, email_
to text, PRIMARY KEY (form_id)); INSERT INTO forms VALUES (1, "form1", "th@hauser-wenz.de");';
$query .= 'CREATE TABLE forms_
fields (field_id int, form_id int, fieldtype_id int, name text, value text, PRIMARY KEY (field_id)); INSERT INTO forms_fields VALUES (1, 1, 1, "PLZ", "00000"); INSERT INTO forms_fields VALUES (2, 1, 2, "Wohnort", "Ihr Wohnort");';
$query .= 'CREATE TABLE forms_
fieldtypes (fieldtype_id int, type text, validation_regexp text, PRIMARY KEY (fieldtype_id)); INSERT INTO forms_fieldtypes VALUES (1, "plz", "\d{5}");INSERT INTO forms_fieldtypes VALUES (2, "text", "\w{2}.*");';
$query .= 'CREATE TABLE forms_
sended_data (form_sended_id int, form_id int, ip text, date text, content text, PRIMARY KEY (form_sended_id));';
$db->queryExec($query);
}
}
$newDb = new CreateDb();
?>
Dieses einfache Beispiel zum Anlegen der Datenbank könnten Sie natürlich noch ausbauen. Sinnvoll wäre beispielsweise noch eine Abfrage, die prüft, ob die entsprechenden Tabellen schon vorhanden sind.