Dieser Überblick erhebt keinen Anspruch auf Vollstängigkeit und soll nur als kleine Einstiegshilfe dienen, da man gerade im deutschsprachigen Web noch relativ wenig Informationen oder Tutorials zu SQLite findet.
Was ist SQLite
SQLite ist eine dateibasierte Datenbank, die seit Version 5 Bestandteil von PHP ist. Es wird also, im Gegensatz zu beispielsweise MySQL, kein Datenbankserver benötigt.
SQLite arbeitet mit Dateien, was den Umgang sehr einfach macht.
Natürlich kann diese Art von Datenbank nicht so Leistungsstark sein wie eine "echte" Datenbank, doch für viele Web-Skripte ist sie sicherlich völlig ausreichend - in vielen Fällen dürften Datenbanken wie z.B. MySQL ohnehin überdimensioniert sein.
Einige Eigenschaften von SQLite und Unterschiede zu MySQL:
- Außer "INTEGER PRIMARY KEY" (auto-increment) ist SQLite ist "typenlos". Es können zwar Spaltentypen festgelegt werden, diese werden aber (mit Ausnahme von "INTEGER PRIMARY KEY") von SQLite ignoriert. Der Logik und Übersichtlichkeit wegen, wird aber trotzdem empfohlen, Spaltentypen zu deklarieren.
- In SQLite gibt es den ALTER-Befehl nicht. Dadurch werden Änderungen an einer Tabellenstruktur etwas komplizierter (Beispiel 7).
- Da SQLite "typenlos" ist, gibt es z.B. den TIMESTAMP-Typ von MySQL in der Form JJJJMMTTHHMMSS und damit verbundene Funktionen wie DATE_FORMAT oder NOW nicht, man kann sich aber mit dem UNIX-Timestamp behelfen (Beispiel 8).
- Als dateibasierte Datenbank kann SQLite nicht so leistungsstark wie MySQL sein: bei jeder Abfrage muss die Datenbank-Datei geöffnet und geschlossen werden. Für die allermeisten Webseiten (auf der SQLite Homepage wird von 99,9% gesprochen) dürfte das aber kein Problem sein.
SQLite-Beispiele für PHP
- Öffnen der Datenbank-Datei und Anlegen einer Tabelle
- Einfügen von Daten
- Einen Datensatz aus der Datenbank holen
- Mehrere Datensätze aus der Datenbank holen
- Datensätze verändern
- Datensätze löschen
- Tabellenstruktur verändern
- Datum und Uhrzeit
- Beispiel-Skripe
1. Öffnen der Datenbank-Datei und Anlegen einer Tabelle
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Tabelle anlegen:
sqlite_query($db, "CREATE TABLE Beispieltabelle (id INTEGER PRIMARY KEY, Sache VARCHAR, Eigenschaft VARCHAR)");
// Datenbank schließen:
sqlite_close($db);
?>
Mit sqlite_open('data.sqlite'); wird die Datei "data.sqlite" geöffnet und $db bekommt das
Datenbank-Handle. Ist die Datei nicht vorhanden, wird versucht, sie anzulegen.
Nun können mit der Funktion sqlite_querey([Handle],[Abfrage]); Datenbank-Befehle ausgeführt
werden.
Im Beispiel wird mit CREATE die Tabelle "Beispieltabelle" mit den Spalten "id", "Sache" und
"Eigenschaft" angelegt. Mit id INTEGER PRIMARY KEY wird die Spalte "id" als
Auto-Increment-Spalte angelegt, d.h. jeder Datensatz bekommt automatisch eine fortlaufende Nummer. Andere
Bezeichnungen für die Spalten wie INTEGER, VARCHAR oder TEXT sind nicht erforderlich, da SQLite "typenlos" ist. Es
wird trotzdem der Logik und Übersichtlichkeit halber empfohlen, Spaltentypen zu vergeben.
Am Ende der Datenbankabfrage(n) wird die Datenbank mit sqlite_close($db); geschlossen.
2. Einfügen von Daten
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Daten einfügen:
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Apfel','essbar')");
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Stein','hart')");
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Holz','brennbar')");
// Datenbank schließen:
sqlite_close($db);
?>
Mit dem INSERT-Befehl werden nun in die Spalten "Sache" und "Eigenschaft" der "Beispieltabelle" Werte eingefügt. Nach dem Ausführen des obigen Beispiels sähe die Beispieltabelle so aus:
| id | Sache | Eigenschaft |
| 1 | Apfel | essbar |
| 2 | Stein | hart |
| 3 | Holz | brennbar |
In die Spalte "id" wurde wegen dem Spaltentypb INTEGER PRIMARY KEY wie gewünscht für jeden Datensatz eine fortlaufende Nummer eingetragen.
Da die Datenbank-Datei im obigen Beispiel für jede einzelne Abfrage geöffnet und geschlossen wird, kann es bei vielen Abfragen zu einer übermäßigen Server-Beanspruchung kommen. Man kann deshalb auch mehrere Abfragen zwischen BEGIN und COMMIT gruppieren. Alle Abfragen dazwischen werden dann auf einmal abgearbeitet:
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Abfragen sammeln:
sqlite_query($db, "BEGIN");
// Daten einfügen:
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Brot','essbar')");
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Feuer','heiß')");
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('Wasser','flüssig')");
// gesammelte Abfragen ausführen:
sqlite_query($db, "COMMIT");
// Datenbank schließen:
sqlite_close($db);
?>
Hinweis: Werden Werte als Variablen z.B. aus Formulareingaben in die Datenbank eingefügt, sollten sie mit der
Funktion sqlite_escape_string() aufbereitet werden, z.B.:
sqlite_query($db, "INSERT INTO Beispieltabelle (Sache, Eigenschaft) VALUES ('".sqlite_escape_string($Sache)."','".sqlite_escape_string($Eigenschaft)."')");
3. Einen Datensatz aus der Datenbank holen
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Daten holen:
$result = sqlite_query($db, "SELECT Sache, Eigenschaft FROM Beispieltabelle WHERE id = 1 LIMIT 1");
// Daten in Array speichern:
$data = sqlite_fetch_array($result);
// Daten ausgeben:
echo $data['Sache'] . ' - ' . $data['Eigenschaft'];
// Datenbank schließen:
sqlite_close($db);
?>
Hier wird mit SELECT der Datensatz aus der Beispieltabelle geholt, der in der Spalte
"id" den Wert 1 hat. Mit LIMIT 1 wird sichergestellt, dass auch nur ein Datensatz geholt
wird (das ist für dieses Beispiel nicht unbedingt notwendig, da durch die Auto-Increment-Spalte "id" der Wert 1
sowieso nur einmal vorkommen kann).
Die Ausgabe sieht folgtendermaßen aus:
4. Mehrere Datensätze aus der Datenbank holen
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Daten holen:
$result = sqlite_query($db, "SELECT Sache FROM Beispieltabelle WHERE Eigenschaft = 'essbar' ORDER BY id ASC");
// Daten zeilenweise in Array speichern und ausgeben:
while ($data = sqlite_fetch_array($result))
{
echo $data['Sache'] . '<br />';
}
// Datenbank schließen:
sqlite_close($db);
?>
Hier werden nun alle Datensätze nach "id" in aufsteigender (ASC) Reihenfolge geordnet geholt, die in der Spalte "Eigenschaft" den Wert "essbar" haben. Anschließend wird das Abfrageergebnis datensatzweise in einen Array übergeben und ausgegeben. Es wird folgendes ausgegeben:
Brot
Man kann die Daten auch absteigend und alphabetisch sortieren. Mit
SELECT Sache FROM Beispieltabelle WHERE Eigenschaft = 'essbar' ORDER BY Sache DESC
sahe die Ausgabe so aus:
Apfel
Hinweis: Wurden die Werte beim Eintragen in die Datenbank mit sqlite_escape_string()
behandelt (siehe Hinweis in Beispiel 2), so muss dies bei der Abfrage berücksichtigt werden, z.B.:
sqlite_query($db, "SELECT Sache FROM Beispieltabelle WHERE Eigenschaft = '".sqlite_escape_string($Eigenschaft)."'");
5. Datensätze verändern
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// "Eigenschaft" von "Holz" verändern:
sqlite_query($db, "UPDATE Beispieltabelle SET Eigenschaft='hart' WHERE Sache='Holz'");
// Datenbank schließen:
sqlite_close($db);
?>
Mit UPDATE kännen Datensätze verändert werden. Im Beispiel wird in den Datensätzen,
die in der Spalte "Sache" den Wert "Holz" haben in die Spalte "Eigenschaft" der Wert "hart" eingetragen. Das
könnte auch mehrere Datensätze betreffen. Wenn wirklich nur ein bestimmter Datensatz geändert werden soll, sollte man
ihn über die eindeutige Spalte "id" ansprechen, z.B.:
UPDATE Beispieltabelle SET Eigenschaft='hart' WHERE id=7
6. Datensätze löschen
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// alle Datensätze löschen, die in der Spalte "Eigenschaft" der Wert "hart" haben:
sqlite_query($db, "DELETE FROM Beispieltabelle WHERE Eigenschaft = 'hart'");
// Datenbank schließen:
sqlite_close($db);
?>
Hier werden mit DELETE alle datensätze gelöscht, die in der Spalte "Eigenschaft" den Wert "hart" haben. Um einen bestimmten Datensatz zu löschen, spricht man ihn wie oben beschrieben "id" an.
7. Tabellenstruktur verändern
In SQLite gibt es den Befehl ALTER nicht. So ist das Verändern der Tabellenstruktur nur indirekt möglich. Im folgenden Beispiel soll in die Beispieltabelle eine neue Spalte "Beschreibung" hinzugefügt werden. Dafür wird zunächst eine temporäre Tabelle erstellt. In diese Tabelle werden die Daten der Beispieltabelle übertragen. Dann wird die Beispieltabelle gelöscht und neu mit den Spalten "id", "Sache", "Eigenschft" und "Beschreibung" erstellt. Schließlich werden die Daten von der temporären Tabelle in die neue Beispieltabelle übertragen. Da es in der neuen Beispieltabelle eine Spalte mehr gibt als in der temporären Tabelle, wird mit '' eine Leere Zeichenkette mitgegeben.
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Befehle sammeln:
sqlite_query($db, "BEGIN");
// Temporäre Tabelle anlegen:
sqlite_query($db, "CREATE TEMPORARY TABLE Beispieltabelle_temp (id, Sache, Eigenschaft)");
// Daten von der Beispieltabelle in die temporäre Tabelle übertragen:
sqlite_query($db, "INSERT INTO Beispieltabelle_temp SELECT id, Sache, Eigenschaft FROM Beispieltabelle");
// Beispieltabelle löschen...
sqlite_query($db, "DROP TABLE Beispieltabelle;");
// ...und neu erstellen mit zusätzlicher Spalte:
sqlite_query($db, "CREATE TABLE Beispieltabelle (id INTEGER PRIMARY KEY, Sache VARCHAR, Eigenschaft VARCHAR, Beschreibung VARCHAR)");
// Daten aus der temporären Tabelle in die neue Beispieltabelle übertragen:
sqlite_query($db, "INSERT INTO Beispieltabelle SELECT id, Sache, Eigenschaft, '' FROM Beispieltabelle_temp");
// temporäre Tabelle löschen:
sqlite_query($db, "DROP TABLE Beispieltabelle_temp");
// gesammlete Befehle ausführen:
sqlite_query($db, "COMMIT");
// Datenbank schließen:
sqlite_close($db);
?>
8. Datum und Uhrzeit
Mit der Zeit gibt es ein paar Unterschiede zu MySQL: das Timestamp-Format in der Form JJJJMMTTHHMMSS und die
Funktionen zum formatieren gibt es in SQLite nicht. Man muss sich mit dem UNIX-Timestamp-Format
(Sekunden seit 1. Januar 1970, 0:00 Uhr) behelfen und die Zeitangabe mit PHP formatieren. Mit
sqlite_query($db, "INSERT INTO Tabelle (time) VALUES (strftime('%s','now')");
wird ein Datensatz mit einem
UNIX-Timestamp der aktuellen Uhrzeit in die Spalte "time" eingetragen.
Um die Zeitangabe wieder "lesbar" zu machen, wird sie ganz normal wie in Beispiel 3 aus der Datenbank
geholt und mit der PHP-Funktion strftime() formatiert. Für die Form TT.MM.JJJJ, HH:MM Uhr sähe das so aus:
strftime('%d.%m.%Y, %H:%M', $data['time']);
Achtung: Die PHP Funktion strftime() hat nichts mit der SQLite-Funktion strftime() zu tun. So
gibt es z.B. auch Unterschiede bei der Formatierung, siehe
PHP-Manual strftime und
SQLite - Date And Time Functions.
Im folgenden Beispiel wird eine neue Tabelle in der Datenbank-Datei "data.sqlite" erstellt (Beispieltabelle_2), ein Datensatz mit der aktuellen Zeit eingetragen, ausgelesen und ausgegeben:
<?php
// SQLite-Datenbank öffnen:
$db = sqlite_open('data.sqlite');
// Tabelle anlegen:
sqlite_query($db,"CREATE TABLE Beispieltabelle_2 (id INTEGER PRIMARY KEY, Datum TIMESTAMP, Wetter VARCHAR)");
// Daten einfügen:
sqlite_query($db, "INSERT INTO Beispieltabelle_2 (Datum, Wetter) VALUES (strftime('%s','now'),'Regen')");
// Daten holen:
$result = sqlite_query($db, "SELECT Datum, Wetter FROM Beispieltabelle_2 WHERE id = 1 LIMIT 1");
// Daten in Array speichern:
$data = sqlite_fetch_array($result);
// Daten ausgeben:
echo strftime('%d.%m.%Y, %H:%M', $data['Datum']) . ': ' . $data['Wetter'];
// Datenbank schließen:
sqlite_close($db);
?>
Ausgabe:
9. Beispiel-Skripte
- phpSQLiteCMS - ein einfaches CMS (wird auf dieser Webseite eingesetzt)
Links zu SQLite
- Homepage des SQLite-Projektes:
SQLite home page - Webtool für die SQLite-Administration (ähnlich wie phpMyAdmin für MySQL):
SQLiteManager
Kommentare
Hm, kann ich nicht bestätigen. Habe jetzt schon bei mehreren Shared-Hosting-Providern mein kleines phpSQLiteCMS installiert.
Es gibt nicht viele Webhoster die so etwas anbieten, das stimmt. Aber manche gibt es schon.
Ich biete selber webhosting an, und bei mir wird das unterstützt...
Timo, Sonntag, Juni 03, 2007, 09:29:
Das größte Manko von SQLite ist derzeit immer noch die sehr kleine Verbreitung bei Webhostern. Ich habe bei vielen Hostern angefragt, ob es Unterstützung für SQLite gibt; dies wurde mir jedoch zu 100% verneint. PHP5 ja, aer ohne SQLite, da es zu viel Serverlast verursacht.
Bleibt einfach nur der eigene Server übrig.