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.