Gästebuch mit SQLite
Der kleine Neffe von MySQL

Big DataData & StorageDeveloperIT-ProjekteSoftware

Seit der PHP-Version 5 gibt es ein neues relationales DBMS, das von PHP automatisch unterstützt wird: SQLite. Der Workshop zeigt, wie Sie damit ein Gästebuch programmieren können.

Datenbank light

Gästebuch mit SQLite

Der Sprachumfang von SQLite ist wesentlich geringer als der von MySQL. Dafür kann SQLite jedoch mit interessanten Datentypen wie etwa BOOLEAN aufwarten. Während MySQL als Server-Dienst im Hintergrund läuft, arbeitet SQLite mit Dateien. Für jede Datenbank wird eine neue Datei mit allen Tabellen und Datensätzen angelegt. Anstatt also nun mittels TCP/IP auf einen Datenbankserver zuzugreifen, wird lediglich die Datenbankdatei geöffnet, genauso wie bei Microsoft Access.

Der Vorteil ist, dass sich die Datenbank ganz schnell mittels Copy and Paste auf ein anderes System übertragen lässt. Für SQLite-Datenbankdateien wird in der Regel die Endung SQLITE verwendet. Sie sollten, müssen aber diese Endung nicht verwenden, da Sie immer den vollen Dateinamen angeben müssen.

Jedoch sollten Sie darauf achten, die Endung entweder in der Apache-Konfiguration so einzustellen, dass darauf nicht direkt zugegriffen werden kann und sie nicht in einer Verzeichnisauflistung erscheint, oder aber die Datenbankdatei außerhalb des Root-Verzeichnisses des Webservers abzulegen. Es wäre ungünstig, wenn dritte Personen sich Ihre Datenbank einfach herunterladen können, vorausgesetzt, sie kennen den Namen der Datei.


Anlegen einer Datenbank

Gästebuch mit SQLite

Zunächst einmal muss eine neue Datenbank angelegt werden, beziehungsweise eine neue Datenbankdatei. Es gibt dazu auch das eine oder andere Tool, jedoch lässt sich dies auch recht flott mittels eines PHP-Skripts erledigen. Auf der Heft-CD finden Sie in den Listings zu diesem Artikel unter anderem ein Skript namens create_db.php. Dieses legt beim Aufruf eine Datenbank mit dem Namen guestbook.sqlite an. Das Skript überprüft, ob die Datenbankdatei bereits existiert. Falls nicht, wird mit dem Befehl sqlite_
open
die Datei angelegt. Als Zugriffsmodus wird dabei der oktale Wert 0666 verwendet und Fehlermeldungen werden in der Variablen $dberror gespeichert.

if($dbhandle = sqlite_open($dbfile,0666,$dberror))

Das Handle auf die Datenbank wird in der Variablen $dbhandle gespeichert. Für alle weiteren Operationen auf der Datenbank muss dieses Handle mit angegeben werden. Anschließend wird in der Variablen $sql die Anweisung zum Erzeugen der Tabelle entries gespeichert.

$sql = 'CREATE TABLE entries
(id INTEGER PRIMARY KEY, title VARCHAR(64),
message TEXT, author VARCHAR(128),
email VARCHAR(255), homepage VARCHAR(255),
datetime TIMESTAMP)';

Die verwendeten Datentypen gleichen denen von MySQL und entsprechen sich auch in ihren Eigenschaften. In einem Feld vom Typ TIMESTAMP können Sie einen beliebigen Unix-Zeitstempel speichern. Dieser muss also nicht zunächst wie in MySQL konvertiert werden.

Diese Anweisung wird daraufhin von sqlite_query ausgeführt. Als erster Parameter wird das Handle ($dbhandle) übergeben und als zweiter die auszuführende SQL-Anweisung. Im nächsten Schritt wird mit sqlite_close die Datenbank geschlossen und eine Meldung über das Erzeugen der Datenbank ausgegeben.


Einträge anzeigen

Gästebuch mit SQLite

‘.$row[‘title’].’
von '.$row['author'].'
';

echo 'Datum: '.strftime('%d.%m.%Y%H:%M:%S',$row['datetime']).'
';

echo 'Nachricht: '.$row['message'].'
';

echo ''.$row['homepage'].'


Neue Einträge

Gästebuch mit SQLite

Das Formular aus dem Skript index.php verweist auf das Skript save_entry.php. In diesem werden die mittels POST übertragenen Werte entgegengenommen und vorbereitet. Dabei werden alle < und > durch die entsprechenden HTML-Entities ersetzt und die Funktion sqlite_escape_string aufgerufen. Damit verhindern Sie, dass ein Benutzer mittels Code-Injection in Ihrem Gästebuch herumbastelt und dabei Datensätze löscht oder aber mittels HTML-Code anderen Besuchern Schaden zufügt.

Wurde für jedes Feld ein Wert eingegeben, wird die Datenbank geöffnet und die SQL-Anweisung zum Einfügen des Datensatzes werden erzeugt.

$sql = "INSERT INTO entries VALUES
(NULL,'$title','$message','$author','$email','$homepage',".time().")";

Für das Feld id wird NULL übergeben, damit automatisch ein eindeutiger Wert ermittelt wird. Für das Feld datetime wird die PHP-Funktion time aufgerufen, welche den aktuellen Zeitpunkt als Unix-Zeitstempel zurückgibt. Daraufhin wird die Anweisung ausgeführt, die Datenbank geschlossen und auf die Startseite mittels header-Funktion umgeleitet.


Einträge löschen

Gästebuch mit SQLite

Es gibt immer wieder Spaßvögel, die unsinnige Einträge in einem Gästebuch hinterlassen. Damit solche Einträge nicht hingenommen werden müssen, lassen sich unerwünschte Datensätze löschen. Im Unterverzeichnis admin befindet sich dafür das Skript index.php. Dieses listet alle Einträge tabellarisch auf und stellt für jeden einen Link zum Löschen zur Verfügung. Da sich die Datenbankdatei in einem übergeordneten Verzeichnis befindet, muss der Pfad entsprechend abgeändert werden.

$dbfile = '../guestbook.sqlite';

Der Löschen-Link öffnet das Skript delete.php und übergibt ihm die ID des zu löschenden Datensatzes.

$id = $_GET['id'] ? $_GET['id'] : false;
if($id <> false)

Wurde eine ID übergeben, wird die Datenbank geöffnet und die SQL-Anweisung zum Löschen vorbereitet.

$sql = "DELETE FROM entries WHERE id = $id";
sqlite_query($dbhandle,$sql);
sqlite_close($dbhandle);
header('Location: index.php');

Die Anweisung wird ausgeführt, der Zugriff auf die Datenbank beendet und auf das Skript index.php umgeleitet.


Fazit

Gästebuch mit SQLite

SQLite kann durchaus eine Alternative zu MySQL sein, je nachdem, in welchem Umfeld es eingesetzt wird. Die Datenbank bietet alle Möglichkeiten, die von den meisten Webprogrammieren von MySQL genutzt werden, also das Lesen, Einfügen und Löschen von Datensätzen.

Problematisch wird es bei mehreren parallelen Zugriffen auf die Datenbank. Zwar ist dies möglich, die Geschwindigkeit sackt jedoch ab. Für kleine Programme wie ein Gästebuch oder eine News-Verwaltung sollte SQLite ausreichen. Sobald es jedoch auf Performance ankommt und viele Zugriffe zur gleichen Zeit erfolgen, ist auf jeden Fall die Verwendung von MySQL anzuraten. Beachten Sie, dass es keine Benutzerverwaltung wie unter MySQL gibt. Jeder, der möchte, kann auf die Datenbank zugreifen, solange ihm dies das Betriebssystem ermöglicht. Weitere Informationen zu SQLite finden Sie auf den Webseiten www.sqlite.org und www.php.net/manual/de/ref.sqlite.php.