Formulardaten haben einen feldorientierten Aufbau, und alle gesendeten Daten des gleichen Formulars enthalten die gleichen Felddaten. Die optimale Form, solche Daten zu speichern, ist eine Tabelle. Die Felder des Formulars sind dabei die Spalten der Tabelle, und die einzelnen abgesendeten Formulare sind die Zeilen. Tabellenorientierte Datenbanksysteme wie MySQL, PostgreSQL, Oracle usw. sind bestens geeignet, um solche Daten aufzunehmen, gerade auch dann, wenn es sich um große Datenmengen handelt, also wenn sehr viele Formulare abgesendet werden.
Das Beispiel dieses Abschnitts zeigt, wie Sie Kommentare zu Artikeln in einer Datenbanktabelle speichern können. Dabei kommt das beliebte Datenbank-Management-System MySQL zum Einsatz. Als Scriptsprache für die Formularauswertung wird wie schon im letzten Beispiel PHP verwendet.
<form method="post" action="artikel.php?id=283"> <p><label>Name:<br><input type="text" name="name"></label</p> <p><label>Mail:<br><input type="text" name="mail"></label</p> <p><label>Kommentar:<br> <textarea name="text" cols="50" rows="8"></textarea></label</p> <input type="submit" value="OK"> </form>
Im Formular kann der Anwender die typischen Kommentardaten wie Name, E-Mail-Adresse und Kommentartext eingeben.
Das Beispiel nimmt an, dass das HTML-Dokument mit dem gesamten Artikelinhalt, den bereits vorhandenen Kommentaren und dem gezeigten Formular von einem PHP-Script namens artikel.php ausgegeben wird. Der HTML-Code der Webseite muss ja dynamisch erzeugt werden, da die bereits vorhandenen Kommentare aus der Datenbank gelesen und mit ausgegeben werden müssen.
Wenn der Anwender das Formular absendet, wird entsprechend der Angabe im action-Attribut des <form>-Tags wieder die artikel.php aufgerufen. Im GET-Parameter id wird wieder die aktuelle Artikelnummer angegeben. Denn nach dem Absenden des Formulars soll wieder der gleiche Artikel angezeigt werden, jedoch mit dem neu hinzugekommenen Kommentar des Anwenders. Die Formulardaten werden als POST-Daten (method="post") übergeben.
Um besser zu verstehen, wie das datenverarbeitende PHP-Script artikel.php arbeitet, ist es sinnvoll, einen Blick in die Datenbanktabelle zu werfen, in die das PHP-Script die Formulardaten schreibt. Auch ein Blick in die Datenbanktabelle mit den eigentlichen Artikeln gehört zum Verständnis. Beide Tabellen stellen kleine Ausschnitte der gesamten gespeicherten Daten dar.
id | articleid | name | text | timestamp | |
---|---|---|---|---|---|
19495 | 132 | Kakadu | kakadu@example.org | viel Text… | 1274533401 |
19496 | 283 | Dr. House | drhouse@example.com | Kommentartext | 1274533475 |
19497 | 621 | Martin Murr | mm@example.net | Viel Gemurre | 1274533622 |
id | title | text | timestamp |
---|---|---|---|
282 | Irre Sache | Viel Text… | 1274010023 |
283 | Toller Artikel-Titel | Viel Interessantes | 1274245310 |
283 | Das Neueste | Viel Neues | 1274298808 |
Die Tabelle für Kommentare enthält mit den Spalten bzw. Feldnamen name, mail und text Felder für die Daten, die der Anwender beim Beitragen von Kommentaren ausfüllt. Die übrigen Felder werden vom PHP-Script bzw. von MySQL verwaltet. Die Spalte id enthält laufende, eindeutige Nummern, um Datensätze eindeutig zu identifizieren. Dies ist erforderlich, wenn Bezüge (Relationen) zu bestimmten Datensätzen hergestellt werden sollen. Die Spalte articleid ist so ein Fall. Sie enthält eindeutige Bezugsnummern aus der zweiten gezeigten Tabelle, nämlich aus der Tabelle für Artikel. Auf diese Weise wird in der Datenbank festgehalten, welcher Kommentar zu welchem Artikel gehört. Die Spalten timestamp in beiden Tabellen halten den Speicherzeitpunkt in Form eines Unix-Zeitstempels fest (Anzahl Sekunden seit 1.1.1970, 0:00 Uhr).
Code-Details des nachfolgenden PHP-Scripts werden in diesem Zusammenhang nicht beschrieben. Der Quelltext des Listings ist ausführlich kommentiert, damit Sie in etwa nachvollziehen können, wie das Script seine Aufgaben abarbeitet.
$html = ""; $errorMessage = ""; // Wenn eine Artikelnummer mit GET-Parameter ?id=# angegeben ist: if(isset($_GET['id'])) { // Datenbankverbindung aufbauen: $dbh = mysql_connect("localhost", "webserver", "sda523erf"); if(!$dbh) // Falls keine Verbindung aufgebaut werden konnte: $errorMessage .= '<div class="error">Keine Datenbankverbindung!</div>'; // Artikeldatenbank öffnen $sql = "use test"; $sqlResult = @mysql_query($sql, $dbh); if(!$sqlResult) // Artikeldatenbank konnte nicht geöffnet werden: $errorMessage .= '<div class="error">Artikeldatenbank konnte nicht geöffnet werden</div>'; if($dbh and $sqlResult) { // Alles OK mit der Datenbank: // Prüfen, ob Kommentardaten zum Speichern vorliegen: if(isset($_POST['name']) and isset($_POST['mail']) and isset($_POST['text'])) { // Daten zum Speichern in der Datenbank vorbereiten: $_POST['name'] = stripslashes($_POST['name']); $_POST['mail'] = stripslashes($_POST['mail']); $_POST['text'] = stripslashes($_POST['text']); $_POST['name'] = strip_tags($_POST['name']); $_POST['mail'] = strip_tags($_POST['mail']); $_POST['text'] = strip_tags($_POST['text'], '<p><br><b><i><a>'); $_POST['name'] = mysql_real_escape_string($_POST['name']); $_POST['mail'] = mysql_real_escape_string($_POST['mail']); $_POST['text'] = mysql_real_escape_string($_POST['text']); $_POST['name'] = "'" . $_POST['name'] . "'"; $_POST['mail'] = "'" . $_POST['mail'] . "'"; $_POST['text'] = "'" . $_POST['text'] . "'"; // Restliche Datenfelder vorbereiten: $timestamp = time(); $articleid = (int) $_GET['id']; // Kommentar in Datenbanktabelle 'comments' schreiben: $sql = "insert into comments"; $sql .= "(articleid, name, mail, text, timestamp) values ("; $sql .= $articleid.", "; $sql .= $_POST['name'].", "; $sql .= $_POST['mail'].", "; $sql .= $_POST['text'].", "; $sql .= $timestamp.")"; $sqlResult = @mysql_query($sql, $dbh); if(!$sqlResult) // Datensatz konnte nicht gespeichert werden: $errorMessage .= '<div class="error">Kommentar konnte nicht gespeichert werden</div>'; } // ENDE: if(isset($_POST['name']) and isset($_POST['mail']) ... // Artikel aus Datenbank lesen $sql = "select * from articles where id = " . (int) $_GET['id']; $sqlResult = mysql_query($sql, $dbh); if(!$sqlResult) // Keine Ergebnismenge: $errorMessage .= '<div class="error">Artikel nicht gefunden</div>'; else // Ergebnismenge vorhanden: // Datensatz des Artikels "holen": $articleData = mysql_fetch_array($sqlResult, MYSQL_ASSOC); // HTML-Ausgabe erzeugen: $html .= '<!DOCTYPE html>'."\n"; $html .= '<html><head><meta charset="utf-8">'."\n"; $html .= '<title>'.$articleData['title'].'</title>'."\n"; $html .= '</head><body><h1>Das Artikelmagazin</h1>'."\n"; if(strlen($errorMessage) > 0) // Wenn es eine Fehlermeldung gibt: // Fehlermeldung einfügen: $html .= $errorMessage."\n"; $html .= '<section><h2>'.$articleData['title'].'</h2>'."\n"; $html .= '<article>'."\n"; $html .= $articleData['text']."\n"; $html .= '</article></section><section>'."\n"; // Kommentare zum Artikel aus Datenbank lesen $sql = "select * from comments where articleid = "; $sql .= (int) $_GET['id']; $sql .= " order by timestamp"; $sqlResult = mysql_query($sql, $dbh); if($sqlResult) { // Ergebnismenge vorhanden: $html .= '<h2>Kommentare</h2>'."\n"; // Datensätze "holen": while($record = mysql_fetch_array($sqlResult, MYSQL_ASSOC)) { $html .= '<article><p>'.$record['name']; $html .= ' schrieb:</p>'."\n"; $html .= '<div>'.$record['text'].'</div>'."\n"; $html .= '</article>'."\n"; } // ENDE: while(...) } // ENDE: if($sqlResult) $html .= '<h2>Ihr Kommentar:</h2>'."\n"; $html .= '<form method="post"'."\n"; $html .= 'action="artikel.php?id='.(int) $_GET['id'].'">'."\n"; $html .= '<p><label>Name:<br>'."\n"; $html .= '<input type="text" name="name"></label</p>'."\n"; $html .= '<p><label>Mail:<br>'."\n"; $html .= '<input type="text" name="mail"></label</p>'."\n"; $html .= '<p><label>Kommentar:<br>'."\n"; $html .= '<textarea name="text" cols="50" rows="8">'; $html .= '</textarea></label</p>'."\n"; $html .= '<input type="submit" value="OK">'."\n"; $html .= '</form></section>'."\n"; $html .= '</body></html>'."\n"; } // ENDE: Alles OK mit der Datenbank else { // Nicht alles OK mit der Datenbank $html .= '<!DOCTYPE html>'."\n"; $html .= '<html><head><meta charset="utf-8">'."\n"; $html .= '<title>'.$articleData['title'].'</title>'."\n"; $html .= '</head><body><h1>Das Artikelmagazin</h1>'."\n"; // Fehlermeldung einfügen: $html .= $errorMessage."\n"; $html .= '</body></html>'."\n"; } } // ENDE: if(isset($_GET['id'])) else { // kein GET-Parameter "id" vorhanden $errorMessage .= '<div class="error">Keinen Artikel ausgewählt!</div>'; $html .= '<!DOCTYPE html>'."\n"; $html .= '<html><head><meta charset="utf-8">'."\n"; $html .= '<title>'.$articleData['title'].'</title>'."\n"; $html .= '</head><body><h1>Das Artikelmagazin</h1>'."\n"; // Fehlermeldung einfügen: $html .= $errorMessage."\n"; $html .= '</body></html>'."\n"; } // HTML ausgeben: // Damit wird die Seite an den Browser gesendet: echo $html;
Erkennbar ist, dass das Script prüft, ob Formulardaten des Kommentarformulars vorliegen. Wenn ja, werden die Daten für das Speichern in der Datenbank vorbereitet und anschließend als neuer Datensatz in der Datenbanktabelle comments gespeichert. Anschließend wird der HTML-Code der auszugebenden Artikelseite Stück für Stück erzeugt. Dabei werden die Daten des anzuzeigenden Artikels aus der Datenbank gelesen, sowie alle Kommentare, die zu diesem Artikel gehören. All diese Daten werden in den auszugebenden HTML-Code eingefügt. Falls zuvor ein Kommentar des aktuellen Anwenders gespeichert wurde, wird auch dieser bereits mit aus den Daten gelesen und mit ausgegeben. Aus Sicht des Anwenders wird also nach dem Absenden eines Kommentars zu einem Artikel die Seite mit dem Artikel erneut angezeigt, und sein eigener Kommentar wird dabei bereits mit angezeigt.
Korrekturen, Hinweise und Ergänzungen
Bitte scheut euch nicht und meldet, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Diskutieren wählen. Es ist keine Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden allerdings kommentarlos entfernt.