Hallo,
GB? Gigabyte?
Ich meinte Gästebuch ;-)
ja, aus dem Kontext war das leicht zu erraten. Ich wollte dich nur darauf hinweisen, dass die Abkürzung meiner Ansicht nach weder selbstverständlich noch allgemein bekannt ist.
Diese Zeile müsste drei Fehlermeldungen (Notices) produzieren, weil du vermutlich keine Konstanten mit den Namen name, email und eintrag definiert hast. Du meinst eigentlich
$_POST['name'], $_POST['email'], $_POST['eintrag']
Es komtm aber keine Fehlermeldung, fuktioniert tadelos...
Wenn keine Fehlermeldungen kommen, hast du (oder dein Webhoster) sie abgestellt. Es aber ist zumindest in der Entwicklungsphase sehr hilfreich, als erste Anweisung im Script
error_reporting(E_ALL);
zu setzen. Dann bekommt man nämlich alle diese kleinen "Schlampereien" auch gemeldet.
Dass der Code trotzdem funktioniert, liegt an der Pseudo-Intelligenz von PHP, den Namen, der syntaktisch gesehen eigentlich der Name einer Konstanten wäre, stattdessen als String zu interpretieren, wenn die entsprechende Konstante nicht existiert.
echo "<h2>Bitte alle Felder ausfüllen!</h2>";
Ist eine solche Aufforderung eine Überschrift zweiter Ordnung?
Hab in einer CSS-Style datei h2 definirt gahebt und dieses Aussehn passte ganz gut dahin, deshalb die Überschrift zweiter Ordnung... aber macht man wahrscheinlcih dann normalerweise anders oder?^^
Ja. Man zeichnet den HTML-Code erst ohne Beachtung des Aussehens aus, nur nach der Bedeutung der Inhalte. Erst im zweiten Schritt gibt man den Elementen mit CSS das gewünschte Gesicht. In diesem Fall würde sich, wie Tom auch schon vorschlug, z.B. ein <p class="fehler"> anbieten.
Nebenbei bemerkt ist es gefährlich, gemischte Groß- und Kleinschreibung zu verwenden. [...]
Das war mir in der Tat nciht bewusst-
Das ist nicht schlimm, solange du immer genau auf die Schreibweise achtest. Aber wie oft hatten wir schon panische Meldungen, dass z.B. bestimmte Bilder nicht gefunden würden, obwohl sie ganz bestimmt auf dem Server da wären. Tja, "bild01.jpg" ist eben nicht dasselbe wie "Bild01.jpg".
Also, denk nochmal über das grundsätzliche Konzept nach und versuche, etwas mehr System hineinzubringen. Wenn's irgendwo hakt, kannst du gern nochmal hier nachfragen - wir freuen uns, wenn jemand bereitwillig mitmacht und etwas dabei lernen möchte.
Könntest du mir vielleciht mal einen Code vorschlag schreiben udn den kommentieren, ich glaub nicht, dass ich diese Änderungen auch nur im entferntesten alle alleine hinbekomme...danke schon mal für die Tippes
Ich kann dir einen Vorschlag zur Grobstruktur machen und ein paar Hinweise für die Feinheiten. :-)
1. Initialisiere alle Variablen, die den Formularfeldern zugeordnet sind (Name, E-Mail, Nachricht). Wenn sie im Request übergeben wurden, übernimm sie von dort; andernfalls weise ihnen einen sinnvollen Defaultwert zu (z.B. einen Leerstring). Prinzip:
$name = (isset($_POST['name']) ? $_POST['name'] : "");
2. Prüfe, ob das Formular abgesendet wurde oder das Script direkt per URL aufgerufen wurde. Tipp: Wenn das Formular abgesendet wurde, enthält der Request das Name-Value-Pärchen des Submit-Buttons.
3. Wenn das Formular abgesendet wurde:
3a. Prüfe die eingegebenen Daten auf Richtigkeit nach deinen Kriterien. Überlege dabei, welche Eingaben du als falsch oder nicht erlaubt abweisen musst. Denke auch daran, dass die Eingaben nicht zwangsläufig aus deinem Formular stammen müssen; man kann den Request auch beliebig manipuliert haben.
3b. Wenn die Prüfung erfolgreich war, schreibe die Daten in deine "Datenbank" (siehe unten) und leite per Location-Header wieder auf die ursprüngliche Script-URL zurück. Dadurch "verlierst" du die POST-Parameter, und ein versehentliches zweimaliges Eintragen durch Drücken des Reload-Buttons wird verhindert.
4. Gib die HTML-Seite mit dem Formular aus. Trage dabei die in Schritt 1 ermittelten Werte in die Formularfelder ein. Falls du in Schritt 3a festgestellt hast, dass die Daten nicht deinen Kriterien entsprechen, gib an geeigneter Stelle einen Hinweis aus.
5. Gib die bisherigen Einträge in deiner "Datenbank" aus.
Das war natürlich nur eine ganz grobe Darstellung. Zwei Teile habe ich oben nur kurz gestreift, die möchte ich nochmal etwas genauer ausführen.
Eintragen in die Textdatei:
Du wolltest ja jeweils die neuesten Einträge oben haben, warum auch immer. Beim Lesen gehe ich daher so vor, dass ich erst die Datei komplett lese und dann in umgekehrter Reihenfolge bearbeite. Das setzt aber auch voraus, dass die Datei nicht zu groß werden darf, weil sie komplett in den Arbeitsspeicher passen muss (und PHP hat oft Limits von 8MB oder noch weniger). Du musst also ab und zu hergehen und die ältesten Einträge rauswerfen, wenn die Datei zu groß wird.
~~~php
// Annahme: $name und $email enthalten weder Zeilenumbrüche noch "|"
// Das wurde in der Prüfung (Schritt 3a) sichergestellt.
// $nachricht darf Zeilenumbrüche und "|" enthalten.
// Zeilenumbrüche werden entfernt (maskiert):
$nachricht = str_replace("\n", '\n', $nachricht);
sprintf($NeuerEintrag, "%u | %s | %s | %s\n", time(), $name, $email, $nachricht);
$handle = fopen("gaestebuch.txt", "a");
fwrite($handle, $NeuerEintrag);
fclose($handle);
So, jetzt noch das Auslesen. An dieser Stelle wird auch die Maskierung von HTML-Sonderzeichen vorgenommen, nicht schon beim Eintragen!
~~~php
$Eintraege = file("gaestebuch.txt");
// Rückwärts durchlaufen:
for ($i=count($Eintraege)-1; $i>=0; $i--)
{ $data = explode(" | ", $Eintraege[$i], 4); // Zeile am " | " aufsplitten
echo "Zeitstempel: ", date("d-m-Y, H:i", $data[0]); // erstes Feld
echo "Name: ", htmlspecialchars($data[1]); // zweites Feld
echo "E-Mail: ", htmlspecialchars($data[2]); // drittes Feld
echo "Nachricht: ", htmlspecialchars(str_replace('\n', '<br>', $data[3])); // Rest des Eintrags
}
Ich hoffe, dass dir diese Denkanstöße etwas weiterhelfen; ich möchte, wie gesagt, nur das Prinzip verdeutlichen. Diese Bausteine taugen nicht als fertige Lösung. Aber bestimmt wirst du die verwendeten Funktionen im PHP-Manual nachschlagen und versuchen zu verstehen, was sie machen. Mit konkreten Problemen bei der Umsetzung kannst du gern wieder vorbeikommen. ;-)
So long,
Martin
Mit einem freundlichen Wort und einer Waffe erreicht man mehr, als mit einem freundlichen Wort allein.
(Al Capone, amerikanische Gangsterlegende)