SQLite und PHP

PHP und SQLite3 für Webseiten

SQLite ist eine Datenbank, die mit einer Datei und einem Treiber anstelle eines Datenbankprozess arbeitet. SQLite ist eine vollständige Implementierung von ANSI Standard-SQL. Als schnelle, zuverlässige und relationale Datenbank ist SQLite bestens für Web-Anwendungen geeignet und optimiert für mobile Geräte.

SQLite und PHP

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.

Suchen auf mediaevent.de