10.09.2008, 09:28 Uhr

Datenbankprogrammierung mit SQLite

Die in PHP 5 integrierte Datenbank SQLite bietet vor allem auf Shared-Hosting-Umgebungen hervorragende Möglichkeiten für schnelle Datenbank-Applikationen.
Die in PHP 5 integrierte Datenbank SQLite bietet vor allem auf Shared-Hosting-Umgebungen hervorragende Möglichkeiten für schnelle Datenbank-Applikationen.
Da SQLite in PHP 5 integriert ist, benötigt es keine externen Dienste wie zum Beispiel bei der Kombination MySQL und PHP. Das bringt bei der Datenbankprogrammierung eine Menge Vorteile mit sich, lassen sich so doch sehr leicht Applikationen erstellen und in eine Anwendung integrieren. Die Einrichtung einer neuen Datenbank mit SQLite ist einfach und erfordert keinen Systemadministrator mit besonderen Privilegien.
Die Programmierung von SQLite kann wie beim großen Bruder sowohl objektorientiert als auch mit Prozeduren erfolgen.Allerdings bringt die Tatsache, dass SQLite keinen Serverprozess hat, auch einige Nachteile mit sich. Dazu zählen Probleme beim gleichzeitigem Zugriff, das Fehlen eines beständigen Cachespeichers für Abfragen und Skalierungsprobleme beim Umgang mit sehr großen Datenvolumen. Auch erlaubt SQLite keine unmittelbare Verarbeitung von Binärdaten. Diese müssen beim Speichern zuerst codiert und nach dem Auslesen wieder decodiert werden. Das größte Problem tritt jedoch beim konkurrierenden Zugriff mehrerer Nutzer auf die Datenbank auf: Während andere relationale Datenbanksysteme bei Transaktionen einzelne Tabellen oder auch nur Zeilen sperren, ist bei SQLite beim Einfügen die gesamte Datenbank gesperrt. Das kann bei parallelen Zugriffen zu spürbaren Geschwindigkeitseinbußen führen.
Bei eigenständigen Web-Anwendungen, bei denen es viele Lesezugriffe bei relativ wenigen Schreibzugriffen gibt, fällt dieser Nachteil jedoch nicht so dramatisch ins Gewicht. In solchen Anwendungsszenarien bietet SQLite eine gute Performance.
Datenbank
Im folgenden Workshop sollen verschiedene Varianten des Zugriffs auf eine SQLite-Datenbank anhand eines Beispiels demonstriert werden. Folgendes Szenario liegt dabei zu Grunde: Ein CSV-File mit diversen Nachrichten soll in eine Datenbank geschrieben werden. Diese Informationen sollen anschließend im Rahmen eine Anwendung selektiv auf Webseiten ausgegeben werden.
Die Unterschiede zu serverbasierten Datenbanken und vor allem die Einfachheit demonstriert am besten die Prozedur, die zum Anlegen einen neuen Datenbank notwendig ist. Es geht dabei einfach um das Anlegen einer speziell formatierten Datei in einem Verzeichnis Ihrer Wahl. Zum Erzeugen einer neuen Datenbank müssen Sie nur versuchen, eine zu öffnen. Existiert noch keine Datenbank mit diesem Namen, wird eine neue angelegt. In der Praxis sieht das so aus:
<?php
 $db = new
 SQLiteDatabase("./mediennews.db", 0666,
 &$error) or die("Fehler $error");
 unset($db);
 ?>
Mit dem zweiten Parameter für den Konstruktor kann man übrigens die Zugriffsrechte für die Datenbank festlegen.In der neuen Datenbank soll eine Tabelle news für die einzulesenden Nachrichten erstellt werden. Dazu ist folgender Code erforderlich:
<?php
$query_erstellen = "
CREATE TABLE news (
id INTEGER PRIMARY KEY,
title,
rubrik,
inhalt
);
$db->query($query_erstellen);
?>
Das System der Feldtypen, mit denen man bei SQLite arbeiten kann, ist ebenfalls sehr einfach gestrickt. Es gibt deren zwei: INTEGER für die Speicherung von Zahlen und eine zweite Form, die in etwa mit dem VARCHAR-Typ von MySQL vergleichbar ist. In einem solchen Feld lassen sich jedoch mehr als 255 Zeichen speichern. Man kann ein INTEGER-Feld automatisch inkrementieren, indem man an die Felddefinition den Zusatz PRIMARY KEY anhängt. Es können auch mehrere CREATE TABLE-Abfragen mit einem Funktionsaufruf an die Methode query() ausgeführt werden.
Daten einlesen
In die erstellte Tabelle sollen nun die Informationen, die in dem File mediennews.csv abgelegt sind, übertragen werden. Die einzelnen Felder sind mit einem Semikolon separiert. Dies ist wichtig, weil in der entsprechenden PHPFunktion zum Einlesen der Daten dieser Parameter angegeben werden muss. Vor dem Einlesen muss die Datenbank geöffnet werden. Die eigentliche Einleseprozedur sieht dann so aus:
$handle = fopen
("mediennews.csv","r");
while ( ($data = fgetcsv ($handle,
1000, ";")) !== FALSE ) {
$sql = "INSERT INTO news VALUES
(NULL,'$data[0]', '$data[1]', '$data[2]')";
sqlite_query($dbhandle,$sql);
}
fclose ($handle);
Nun befinden sich alle erfassten Datensätze in der SQLite-Datenbank, und Sie können im nächsten Schritt daran gehen, diese selektiv auszulesen und daraus eine HTML-Seite zu generieren. Dazu müssen Sie einen Blick auf die Struktur der Tabelle werfen. Das erste Feld id ist qua Definition mit einem fortlaufenden Zähler belegt. Dann gibt es in der Tabelle noch die Felder mit der Headline der Nachricht (title), einer Rubrik (rubrik) und das Feld mit der eigentlichen Nachricht (inhalt). Um nun eine Webseite mit den Nachrichten einer ausgewählten Rubrik zu generieren, müssen Sie eine SQL-Abfrage aufbauen, in der Sie via WHERE eine bestimmte Rubrik selektieren und diese dann als SQLite-Query abschicken:
echo "<h1>TV-News</h1>";
$db = sqlite_open("mediennews.db",
0666, $error) or die("Fehler
$error");
$sql = 'SELECT * FROM news WHERE
rubrik="TV" ORDER BY rubrik DESC';
$result = sqlite_query($db, $sql);
if(sqlite_num_rows($result) > 0){
while($row = sqlite_fetch_array($result)){
echo '<p>'.$row['title'].'</p>'.
 '<p>' .stripslashes($row
['inhalt']).'</p>';
}
}
Aus diesen Basiskonstruktionen für das Anlegen, Schreiben und Auslesen kann man die Einfachheit der Programmierung mit SQLite ersehen.
Daten eingeben
Alternativ kann man die Datenbank auch über ein Formular mit Inhalten füllen. Ein Formular für die Eingabe kann zum Beispiel so aussehen:
echo <<<FORMULAR
 <form action="eintragen.php"
 method="post">
 Headline:<br/>
 <input type="text" style=
 "width:350px" name="head"/><br/>
 Artikel: <br/>
 <textarea style="width:350px;
 height:100px" name="text">
 </textarea>
 <br/>
 Rubrik:<br />
 <input type="text"
 style="width:150px"
 name="rubrik"/><br/>
 <br/>
 <input type="submit" name="Send"
 value="Eintragen"/>
 </form>
 FORMULAR;
Die per POST-Variable übergebenen Daten werden dann so in die Tabelle eingetragen:
$a = $_POST['head'];
$b = $_POST['rubrik'];
$c = $_POST['text'];
$db = sqlite_open("mediennews.db",
0666, $error) or die("Fehler
$error");
$sql = "INSERT INTO news VALUES
(NULL, '$a', '$b', '$c')";
sqlite_query($db, $sql);
echo "Datensatz eingetragen<br />
<br />";
Im Prinzip unterscheidet sich die Programmierung einer SQLite-Datenbank in diesem Bereich kaum von der einer anderen Variante wie zum Beispiel MySQL. Man muss allerdings berücksichtigen, dass nicht der gesamte Umfang der Query-Language unterstützt wird.Auf der Seite www.sqlite. org/lang.html ist die unterstützte Syntax ausführlich dokumentiert.
Benutzerdefinierte Funktionen
Quasi als Ausgleich für diese Defizite bietet Ihnen SQLite jedoch die Möglichkeit, eigene Funktionen zu schreiben und diese in Ihren SQL-Abfragen zu verwenden. Mit dem Befehl sqlite_create_function() können Sie eine PHP-Funktion als so genannte User Defined Function (UDF) erzeugen und diese dann direkt in SQL-Befehlen nutzen. Im folgenden Beispiel wird eine Funktion definiert, die die md5-Summe eines Strings berechnet und dann rückwärts ausliefert.Wenn der SQL-Befehl durchgeführt wird, liefert er den Wert der Spalte filename durch die Funktion transformiert zurück. Die Daten, die in $rows stehen, enthalten also die bereits gewandelten Daten:
<?php
function md5_rueckwaerts($string) {
return strrev(md5($string));
}
sqlite_create_function($db, 'md5rw',
'md5_rueckwaerts', 1);
$rows = sqlite_array_query($db,
'SELECT md5rw(filename) from
files');
?>
Durch diese Technik lässt sich zum Beispiel die komplizierte Abarbeitung eines kompletten Abfrageergebnisses mit einer foreach()-Schleife vermeiden. PHP registriert außerdem automatisch eine spezielle Funktion mit dem Namen php, wenn eine Datenbank zum ersten Mal geöffnet wird. Diese Funktion kann genutzt werden, um eine beliebige PHP-Funktion aufzurufen, ohne dass sie zunächst für SQLite erzeugt werden muss. Die Codierung sieht dann so aus:
<?php
$rows = sqlite_array_query($db,
"SELECT php('md5', filename) from
files");
?>
In diesem Beispiel wird die Funktion md5() für jeden Eintrag der Spalte filename aufgerufen und das Ergebnis in $rows geschrieben.
Sicherungsmaßnahmen
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 erscheinen, oder aber die Datenbankdatei außerhalb des Root-Verzeichnisses des Webservers abzulegen. Um die Dateien zu verstecken, legen Sie in dem Verzeichnis eine .htaccess-Datei an und fügen Sie folgende Zeilen ein:
<Files ~ "\.(sqlite)$"> 
Order allow,deny
Deny from all
</Files>
Alternativ können Sie diese Direktive auch direkt in die httpd.conf Ihres Webservers einfügen. Schließlich gibt es noch das Problem, dass nach vielen Schreib- und Löschvorgängen die Größe der Datenbank gleich bleibt, selbst wenn mehr als die Hälfte der Datensätze gelöscht wurde. Die ist kein Fehler. Führen Sie in solchen Fällen einfach die Anweisung vacuum, gefolgt vom Tabellennamen aus. SQLite reorganisiert anschließend die Tabelle und bereinigt sie.
Zurück



Das könnte Sie auch interessieren