Klein, kompakt, dateibasiert

Teil 2: Datenbank-Alternative SQLite

  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.

Datenbank-Alternative

© Archiv

Der Startpunkt: die SQLite-Website (www.sqlite.org).

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

© Archiv

Informativ: die Ausgabe als Objekt.

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);
?>

Mehr zum Thema

Youtube Sperre umgehen GEMA
Videos freischalten

So umgehen Sie die GEMA-Sperre bei Youtube. Was Sie dazu brauchen, und wie es am einfachsten geht.
Neue Fritzboxen unterstützen den AC-Standard.
WLAN-Geschwindigkeit verdoppeln

Mehr WLAN-Geschwindigkeit: Mit dem WLAN-Standard 802.11ac und den richtigen Geräten und Einstellungen verdoppeln Sie den Datendurchsatz.
Netflix auf dem TV
Programm in der Übersicht

Welche Filme und Serien gibt es bei Netflix eigentlich zu sehen? Was ist neu im Streaming-Angebot? Diese Antworten helfen weiter.
Netflix
Streaming

Preise, kompatible Geräte, Datenrate, Serien- und Filmangebot von Netflix: Wir beantworten die wichtigsten Fragen rund um den Streaming-Dienst.
E.T. – Der Außerirdische
Vorschau auf Film- und Serien-Highlights

Amazon Prime Instant Video lockt im Dezember 2016 mit Film-Highlights wie "E.T.", "Fast & Furious 7" und der Serie "Ku’damm 56​".