5.7 Formulare verarbeiten

Im vorerst letzten Schritt von Kapitel 5 möchte ich Ihnen zeigen, wie Sie Benutzereingaben aus Formularen auslesen und in einer Datenbank speichern können, da dies ein sehr häufig auftretender Anwendungsfall ist. Zudem lernen Sie auf diesem Weg, wie Sie auf eine Datenbank über PHP zugreifen können.

Formulardaten speichern

Erstellen Sie sich zuerst einen neuen Unterordner namens contact in Ihrem Projektverzeichnis, welches sich unterhalb des htdocs-Ordners befindet. In diesem Ordner legen Sie nun eine neue Unterseite an, indem Sie beispielsweise die index.php und index.tpl in diesen Ordner kopieren und in report.php bzw. report.tpl umbenennen.

PHP

Der folgende Quellcode 1 zeigt die Datei report.php, in der die Formulardaten ausgelesen und an die Datenbank übergeben werden sollen.

Quellcode 1 - PHP In der Datei report.php werden die Formulardaten an die Datenbank geschickt.
  1. <?php
  2.   include('../overall_header.php');
  3.  
  4.   $title = 'Verbesserungsvorschlag oder Fehler einsenden';
  5.   $note = '';
  6.  
  7.   if(isset($_POST['submit']))
  8.   {
  9.     // Formular-Werte auslesen
  10.     $email = $_POST['email'];
  11.     $content = $_POST['content'];
  12.  
  13.     // Datenbankverbindung herstellen
  14.     $db = mysql_connect('localhost', 'root', '') or die ('Keine Verbindung moeglich');
  15.     mysql_select_db('webdesign-tutorial', $db) or die ('Die Datenbank existiert nicht');
  16.    
  17.     // SQL-Query zusammenbauen
  18.     $query = sprintf("INSERT INTO reports (email, content) VALUES ('%s', '%s')",
  19.                  mysql_real_escape_string($email),
  20.                  mysql_real_escape_string($content));
  21.  
  22.     // SQL-Query ausführen
  23.     $result = mysql_query($query, $db);
  24.     if($result)
  25.       $note = 'Ihr Feedback wurde erfolgreich gespeichert.';
  26.     else
  27.       $note = 'Ihr Feedback konnte leider nicht gespeichert werden.';
  28.   }
  29.  
  30.   include('../overall_footer.php');
  31.   $TBS->LoadTemplate('report.tpl', FALSE);
  32.   $TBS->Show();
  33. ?>

Beachten Sie, dass ich dem include-Befehl in Zeile 2 ein ../ hinzugefügt habe, da die Datei in einem Überordner des contact-Verzeichnisses liegt.
In Zeile 5 wird die Variable $note initialisiert. Diese soll jegliche Hinweise an den Nutzer enthalten, etwa wenn das Formular erfolgreich abgeschickt wurde. Zu Beginn soll diese Variable leer sein, da es keinen Hinweis auf der Seite gibt.
Die Abfrage in Zeile 7 sorgt dafür, dass der sich darunter befindliche Code nur dann ausgeführt wird, wenn der Formular-Button abgeschickt wurde. Wenn Sie die Seite report.php aufrufen, soll Ihnen lediglich ein leeres Formular angezeigt werden. Dafür benötigen Sie zunächst keinen zusätzlichen PHP-Code. Wird das Formular abgeschickt, so wird die Seite erneut aufgerufen und erhält sogenannte POST-Parameter. Diese Parameter entsprechen der Benennung der Felder im Formular selbst. Das Gegenstück zu POST-Parametern sind die GET-Parameter. Der Unterschied liegt darin, dass letztere über die URL übertragen werden und somit für den Nutzer sichtbar sind. Passwörter oder ähnlich sensible Daten sollten Sie daher niemals über GET-Parameter übermitteln. Zeile 10 zeigt ein Beispiel für einen POST-Parameter. Dieser kann über $_POST und dem Feldnamen angesprochen und in einer entsprechenden Variable gespeichert werden.
Um auf die Tabelle in der Datenbank zugreifen zu können, müssen Sie zunächst eine Verbindung herstellen. Zeile 14 zeigt den dafür notwendigen Befehl mysql_connect. Übergeben wird der Server, der Benutzername und das Passwort, welches in unserem Beispiel leer ist, da sich MySQL lediglich lokal befindet. Kann keine Verbindung hergestellt werden, wird das Script beendet und gibt eine Fehlermeldung aus. Über den Befehl mysql_select_db in Zeile 15 wählen Sie anschließend eine Datenbank aus.
Anschließend müssen Sie den SQL-Query, also die Anfrage an die Datenbank formulieren. Diesen Query speichern Sie in der Variable $query mit Hilfe der sprintf-Funktion, über die Sie Platzhalter in einem Text ersetzen können. In diesem Fall werden die beiden %s jeweils durch den ersten bzw. zweiten Übergabewert ersetzt. Das s steht für einen String, also eine Zeichenkette die Sie an dieser Stelle gerne einfügen möchten. Sie müssen den Befehl nicht zwingend verwenden, jedoch verbessert dieser deutlich die Lesbarkeit des Querys, da die beiden Variablen inklusive mysql_real_escape_string im Query selbst platziert werden müssten. Zwingend verwenden sollten Sie aber die Funktion mysql_real_escape_string. Diese sorgt dafür, dass die Inhalte der beiden Variablen maskiert werden, so dass eine SQL Injection (Einschleusen von schadhaften SQL-Anfragen) verhindert werden kann. Zu beachten ist, dass dies natürlich nur für Zeichenketten sinnvoll ist. Übergeben Sie etwa eine Zahl, so sollten Sie diese zunächst mit der Funktion is_numeric() überprüfen, um sicher zu gehen, dass die entsprechende Variable tatsächlich eine Zahl enthält. Diese Sicherheitsmaßnahmen sollten Sie auf alle Variablen anwenden, die über Formulare oder die URL von einem Nutzer übergeben werden können.
Ist die Verbindung erfolgreich hergestellt worden, so können Sie die zuvor ausgelesenen POST-Daten des Formulars in die Tabelle mit dem Befehl mysql_query einfügen. Dazu müssen Sie den Query und die Verbindungs-Kennung der Datenbank übergeben, die Sie zuvor mit mysql_connect in der Variable $db gespeichert haben. In der Variable $result wird anschließend ein true im Erfolgsfall bzw. ein false beim Auftreten eines Fehlers gespeichert. Die Abfrage in Zeile 24 bis 27 sorgt für eine entsprechende Meldung, die in der Variable $note gespeichert wird. Sollten Sie sich darüber wundern, dass etwa in Zeile 25 keine geschweifte Klammer auf die if-Abfrage folgt: Dabei handelt es sich um eine Kurzschreibweise die Sie verwenden können, wenn lediglich ein Befehl ausgeführt werden soll. In der Regel würde ich immer zu Abfragen mit den geschweiften Klammern tendieren, da dies einfach ein sauberer Programmierstil ist und unnötige Fehler vermeidet, jedoch wollte ich Ihnen diese Kurzschreibweise nicht vorenthalten.

Template

Im Template report.tpl wird das Formular definiert, über das die E-Mail-Adresse und das Feedback des Nutzers gespeichert werden kann.

Quellcode 2 - HTML In der Templatedatei report.tpl wird das Formular erstellt.
  1. [onload;file=../overall_header.tpl]
  2.  
  3. <h1>Verbesserungsvorschlag oder Fehler einsenden</h1>
  4. <p>
  5.   <b>[var.note;magnet=p]</b>
  6. </p>
  7.  
  8. <form name="report_form" method="post" action="[var.domain]/contact/report.php">
  9.   <p>
  10.     Ihre E-Mail-Adresse:<br />
  11.     <input type="text" name="email" value="" size="50" />
  12.   </p>
  13.   <p>
  14.     Ihr Feedback:<br />
  15.     <textarea cols="60" rows="5" name="content"></textarea>
  16.   </p>
  17.   <p>
  18.     <input type="submit" name="submit" value="Absenden" />
  19.   </p>
  20. </form>
  21.  
  22. [onload;file=../overall_footer.tpl]

Auch für das Template gilt der Hinweis, dass sich die overall_header.tpl im darüber liegenden Ordner befindet und Sie daher ../ nicht vergessen sollten.
In Zeile 5 soll der Hinweis an den Nutzer ausgegeben werden. Die Option magnet=p sorgt dafür, dass wenn die Variable leer ist, das p-Tag inklusive Inhalt nicht dargestellt wird.
Das Formular erhält in Zeile 8 einen Namen, die Methode der Datenübertragung und eine Aktion, also die URL, an die das Formular die Daten weiterleiten soll.
Innerhalb des Formulars habe ich ein input-Feld für die E-Mail-Adresse und ein Textfeld für das Feedback definiert. Das input-Feld vom Typ submit entspricht einem Button, über den das Formular abgesendet werden kann. Achten Sie bei den Feldern auf die Namensgebung, da Sie diese Namen via PHP ansprechen.

Wenn Sie alles richtig gemacht haben, sollten Sie nach dem Absenden des Formulars die Meldung erhalten, dass alles geklappt hat. Zudem müsste sich anschließend der entsprechende Datensatz in der Datenbank befinden. Rufen Sie dazu die Tabelle reports über phpMyAdmin auf und wählen Sie über die Tab-Navigation den Navigationspunkt Anzeigen. phpMyAdmin zeigt Ihnen daraufhin alle Datensätze, die sich in dieser Tabelle befinden. Abbildung 1 zeigt meine Testdatensätze.

Abbildung 1Nach dem Absenden von Testdaten über das Formular erscheinen diese in der Tabelle.
Abbildung 1
< 5.6 MySQL-Grundlagen 5.8 Content Management System (CMS) >