Zum Inhalt springen
Der Guide für ein smartes Leben.
Klein, kompakt, dateibasiert

Teil 2: Datenbank-Alternative SQLite

Autoren: Redaktion pcmagazin und Tobias Hauser • 2.2.2009 • ca. 3:30 Min

Inhalt
  1. Datenbank-Alternative SQLite
  2. Teil 2: Datenbank-Alternative SQLite

Datenverarbeitung Das Erstellen der Kontaktformulare, die Auswertung und das Speichern der Daten übernimmt eine eigene Klasse FormBuilder. Im Konstruktor wird hier die Datenbankverbindung erstellt. Der Konstruktor erhält als Parameter die ID des gewünschten Formulares....

Datenverarbeitung

Das Erstellen der Kontaktformulare, die Auswertung und das Speichern der Daten übernimmt eine eigene Klasse FormBuilder. Im Konstruktor wird hier die Datenbankverbindung erstellt. Der Konstruktor erhält als Parameter die ID des gewünschten Formulares.

Datenbank-Alternative
Der Startpunkt: die SQLite-Website (www.sqlite.org).
© Archiv

Das heißt, auf der entsprechenden Site, auf der das Formular eingefügt werden soll, muss nur noch ein Objekt der Klasse FormBuilder instanziiert und die korrekte ID übergeben werden. Als Erweiterung wäre hier gleich noch ein Test möglich, ob die Formular-ID in der Datenbank vorhanden ist.

Der zweite Teil des Konstruktors enthält eine Prüfung auf den Wert des Formularelements Senden. Diese Schaltfläche erhalten alle Formulare. Wenn Sie beim Erstellen des Objekts gesetzt ist, wurde das Formular verschickt und die Daten müssen gespeichert werden. Wenn nicht, wird das Formular selbst ausgegeben:

class FormBuilder {
private $db = null;
private $form_id;
function __construct($form_id) {
$this->form_id = $form_id;
$this->db = new SQLiteDatabase
('kontaktdaten.sqlite', 0666, $error);
if (!$this->db) {
$error = (file_exists
('kontaktdaten.sqlite')) ? 'Datenbankdatei lässt sich nicht öffnen: ' . $error : 'Datenbankda-tei lässt sich nicht erstellen: ' . $error;
die($error);
}
if (isset($_POST['Senden'])) {
$this->output('save');
} else {
$this->output('form');
}
}
}

Der Konstruktor ruft die Methode output() auf, die je nach Status für die Weiterverarbeitung sorgt. An dieser Stelle könnten Sie noch komplexere Vorgänge berücksichtigen wie beispielsweise Vorausfüllung oder Fehlermeldungen bei bestimmten Feldern. Auch mehrschrittige Formulare wären denkbar.

function output($status) {
$output = '';
if ($status == 'save') {
$output = $this->save();
} else if ($status == 'form') {
$output = $this->outputForm();
}
echo $output;
}

Zuerst aber zur Ausgabe der Formulare über outputForm(). Dafür kommt in SQLite eine Abfrage mit query() zum Einsatz, da sie eine Rückgabe enthält. Die einfachste Form der Abfrage holt sich nur die Formularfelder:

$query = 'SELECT * FROM forms_fields
WHERE form_id=' . $this->form_id;
$result = $this->db->query($query);

In der hier verwendeten Datenbankstruktur sind den Feldern allerdings jeweils Typen zugeordnet. Das heißt, Sie benötigen auch die Typinformationen, um das richtige Formularelement zu wählen. Dazu können Sie die Abfrage beider Tabellen einfach verbinden:

$query = 'SELECT * FROM forms_fields,
forms_fieldtypes WHERE form_id=' . $this->form_id . ' AND forms_fields.fieldtype_id = forms_fieldtypes.fieldtype_id';
$result = $this->db->query($query);

Neben diesem direkten JOIN erlaubt SQLite auch die anderen bekannten JOIN-Formen wie INNER JOIN, LEFT OUTER JOIN und RIGHT OUTER JOIN. Beim Fehlerhandling können Sie mit der Funktion sqlite_last_error() beziehungsweise der Methode lastError() jeweils auf den letzten Fehler zugreifen und diesen dann mit sqlite_error_string(Fehlercode) in eine nützliche Information verwandeln.

Datenbank-Alternative
Informativ: die Ausgabe als Objekt.
© Archiv

Für die Verarbeitung der Rückgabe von query() bietet SQLite verschiedene Methoden: fetchAll() holt alle Daten als Array. fetch() liefert einen assoziativen Array der aktuellen Zeile und einen nummerischen Index (Vorsicht, die Funktion heißt sqlite_fetch_array()), fetchObject() ein Objekt der aktuellen Zeile. Alle zeilenweisen Abfragen können in eine while-Schleife gepackt werden:

while ($row = $result->
fetchObject()) {
var_dump($row);
echo '<br /><br />';
}

Für unsere Formulardarstellung müssen Sie nun nur noch die entsprechenden HTML-Tags ergänzen und die richtigen Werte auslesen. Da wir zwei Tabellen abfragen, ist bei den Werten zu beachten, dass sich der assoziative Index aus Tabellenname und Feldname zusammensetzt.

$form = '<form action="' . $_SERVER
['PHP_SELF'] . '" method="POST" name="' . '">';
while ($row = $result->fetch()) {
$form .= '<label for="f' . $row
['forms_fields.field_id'] . '">' . $row['forms_fields.name'] . ':</label><br />';
switch ($row['forms_fieldtypes.
type']) {
case 'plz':
$form .= '<input type="text"
name="' . $row['forms_fields.name'] . '" id="f' . $row['forms_fields.field_id'] . '" value="' . $row['forms_fields.value'] . '" size="5" maxlength="5" />';
break;
case 'text':
$form .= '<input type="text"
name="' . $row['forms_fields.name'] . '" id="f' . $row['forms_fields.field_id'] . '" value="' . $row['forms_fields.value'] . '" />';
break;
}
$form .= '<br /><br />';
}
$form .= '<input type="submit" value=
"Senden" name="Senden" />';
$form .= '</form>';
return $form;

Die Überprüfung auf die verschiedenen Typen findet hier in einer einfachen switch-Fallunterscheidung statt. Natürlich könnten Sie hier noch eigene Klassen für jeden Typ definieren und so die Modularität erhöhen. Auch der Einsatz eines Captchas wäre an dieser Stelle vorzunehmen.

Für die endgültige Ausgabe benötigen Sie nur noch eine Datei, die ein Objekt der Klasse FormBuilder instanziiert:

<?php
include_once 'FormBuilder.php';
$myForm1 = new FormBuilder(1);
?>