SQLite – Datenbank in einer Datei
SQLite nimmt eine Datei und nutzt sie als Datenbank. SQLite 3.6 war in den meisten PHP-Installation ab PHP 5.3 schon vertreten, im PHP 7 sitzt SQLite 3.30 (2019-10-11) oder neuer. SQLite ist der zuverlässige Langzeitspeicher in allen Mobilgeräten und damit die meist genutzte Datenbank.
PHP stellt zwei Schnittstellen für SQLite3 bereit:
Natives SQLite3
Das native PHP-SQLite3-Interface ist stark an SQLite3 in C ausgerichtet. Allerdings ist PHP SQLite3 nicht die vollständige Umsetzung von SQLite3 in C, unterstützt Exceptions nicht vollständig und die Fehlerbehandlung ist spartanisch.
PDO – PHP Data Objects
PDO ist eine normalisierte Schnittstelle zu Datenbanken auf verschiedenen Plattformen und stellt in den meisten Fällen das bevorzugte Interface zu SQLite3 dar.
Zugriff auf die SQLite3-Datenbank
Für SQLite-Datenbanken ist keine Konfiguration und kein Login erforderlich.
$db = new SQLite3(DB_FILENAME);
Erzeugt ein Datenbank-Handle $db.
SQLite3 CREATE TABLE
exec wird für INSERT, UPDATE und DELETE benutzt.
$db = new SQLite3(DB_FILENAME);
$db-> exec("CREATE TABLE IF NOT EXISTS tableSpieler(
id INTEGER PRIMARY KEY AUTOINCREMENT,
dokoname TEXT NOT NULL DEFAULT '0',
dokoinfo TEXT NOT NULL DEFAULT '0',
dokosince INTEGER NOT NULL DEFAULT '0')");
SQLite3 INSERT
$db->exec("INSERT INTO $table (
tracktable,
trackspieler,
trackdate) VALUES (
$tracktable,
$tspieler,
'$datetime')");
Fügt einen Datensatz in die Tabelle $table ein. Wenn die eingefügten Werte Zahlen sind, werden keine Hochkommas benötigt.
Beim Einfügen von Strings hingegen braucht PHP/SQLite3 Hochkommas.
SQLite3 – Zuletzt eingefügter Record
$lstrack = $db->lastInsertRowid();
Bei Tabellen mit Primary Key gibt $db->lastInsertRowid() die id des zuletzt eingefügten Datensatz zurück.
SQLite3 SELECT und JOIN
Anfragen an die SQLite3-Datenbank, die Daten zurück geben, werden mit query durchgeführt. Die Ergebnisse werden innerhalb von while mit fetchArray ausgelesen.
$db = new SQLite3(DB_FILENAME);
$results = $db->query("SELECT s.spielid, t.trackdate, t.id
FROM tableTracks AS t
JOIN tableSpieler AS s
WHERE t.trackspieler = s.id
ORDER BY t.id");
while ($row = $results->fetchArray()) {
echo $row['trackdate'];
echo $row['spielid'];
…
}
Die SQLite3-Console
Console öffnen
sqlite3 database.db
zeigt
SQLite version 3.6.20 Enter ".help" for instructions Enter SQL statements terminated with a ";"
Alle Tabellen einer SQLite3-Datenbank anzeigen lassen
select * from sqlite_master;
zeigt die create-Anweisungen für alle Tabellen der Datenbank
table|spieler|spieler|2|CREATE TABLE spieler(
id INTEGER PRIMARY KEY AUTOINCREMENT,
firstname TEXT NOT NULL DEFAULT '',
lastname TEXT NOT NULL DEFAULT '')
table|sqlite_sequence|sqlite_sequence|3|CREATE TABLE sqlite_sequence(name,seq)
table|track|track|4|CREATE TABLE "track"(
id INTEGER PRIMARY KEY AUTOINCREMENT,
spieler INTEGER NOT NULL DEFAULT '0',
points INTEGER INTEGER NOT NULL DEFAULT '0')
Alle Datensätze einer Tabelle anzeigen
select * from spieler;
Alle Datensätze einer Tabelle löschen
delete from track;
Einzelne Sätze löschen
delete from track where trackno < 2000;
SQLite3-Console beenden
.quit
SQLite3 direkt von der Kommandozeile mit dem Befehl in Hochkommas
sqlite3 test.db "select * from customer "
SQLite3-Befehl aus einer Textdatei ausführen
sqlite3 mytest.db < test-sqlite3.sql
SQLite Vor- und Nachteile
In SQLite fehlen einige SQL-Funktionen, so z.B. Right Join, for-each triggers, drop column, alter column.
Es gibt keinen Mechanismus, der einen falschen Datentyp in einem Feld verhindert – ich kann einen String in ein Integer-Feld setzen.
Bei hochfrequenten Schreibvorgängen wird SQLite langsam.
Auf der Pro-Seite wird MacOS seit 10.4 schon mit SQLite ausgeliefert, unter Windows ist SQLite schnell installiert und einfach zu initialisieren. Die Portierung auf einen anderen Server ist denkbar einfach: kopieren und fertig. Und ein Backup: kopieren und fertig.