Toni: Gästebuch übernimmt keine Einträge aus Variable

Hallo zusammen,
ich bin leider bei PHP und HTML nicht besonders firm, deshalb scheitere ich an einem Problem, über das viele vermutlich lachen werden...
Ich hab mir aus einer Anleitung ein textbasiertes Gästebuch gebastelt, es funktioniert, allerdings werden die Variablen, in welche die Texteingaben geschrieben werden, nicht übertragen. Ich hab im Web intensiv gesucht, leider nur einen (fast) passenden Beitrag gefunden (http://forum.de.selfhtml.org/archiv/2005/11/t118500/#m760014), der hat aber mein Problem zwar gelöst, aber nur, indem ich in der PHP.ini die register_globals = On gesetzt habe. In dem Post ist zwar auch was beschrieben, die Variablen über "$_POST['name']" zu setzen, das bekomme ich aber nicht hin.
Hier mal die Def. der Variablen:

"<input type="hidden" name="abgesendet" value="1" />
<input type="text" name="name" size="47"><br>
Email:<br>
<input type="text" name="email" size="47"><br>
Internetseite:<br>
<input type="text" name="url" value="http://" size="47"><br>
Eintrag:<br>
<textarea name="eintrag" rows="10" cols="40"></textarea><br>
<br>"

hier die Übernahme:

if( isset($_POST['abgesendet']) ) {
$datei = fopen("eintraege.txt","a");
$eintrag = ereg_replace("\n","<br>",$eintrag);
$eintrag = stripslashes($eintrag);
$daten = "<hr><b>Name:</b> $name<br>
<b>Email:</b> <a href=mailto:$email>$email</a><br>
<b>Internetseite:</b> <a href=$url>$url</a><br>
<b>Eintrag:</b><br>
$eintrag<br>\n\n";
fwrite($datei,$daten);
fclose($datei);
}

In der Ausgabe (.txt) erscheint dann von der Zeile:
Name:</b> $name<br> (Beispiel)
nur die Benennung "Name", aber nicht der Inhalt von $name
(mit register_globals = On gehts zwar, wäre aber schön, wenn man das Loch zumachen könnte)

Ich hoffe, mir kann jemand helfen,

Danke mal vorab, Gruß - Toni

  1. Hello,

    <form ...                    ?

    "<input type="hidden" name="abgesendet" value="1" />
    <input type="text" name="name" size="47"><br>
    Email:<br>
    <input type="text" name="email" size="47"><br>
    Internetseite:<br>
    <input type="text" name="url" value="http://" size="47"><br>
    Eintrag:<br>
    <textarea name="eintrag" rows="10" cols="40"></textarea><br>
    <br>"

    hier die Übernahme:

    <?php

    if( isset($_POST['abgesendet']) )                 ## hier greifst Du richtigerweise

    ## auf das Post-Array zu
      {

    $datei = fopen("eintraege.txt","a");
      $eintrag = ereg_replace("\n","<br>",$eintrag);  ## woher kommt $eintrag
      $eintrag = stripslashes($eintrag);
      $daten = "<hr><b>Name:</b> $name<br>
      <b>Email:</b> <a href=mailto:$email>$email</a><br>
      <b>Internetseite:</b> <a href=$url>$url</a><br>
      <b>Eintrag:</b><br>
      $eintrag<br>\n\n";

    fwrite($datei,$daten);
      fclose($datei);
    }

    Das Script enthält viele kleinere und größere Fallstricke und Sicherheitslücken. Die sollten auch diskutiert unmd beseitigt werden, bevor Du es wirklich öffentlich zugänglich machst. Aber nicht alle auf einmal ;-)

    Die Verwendung des von PHP automatisch bereitgestellten Arrays $_POST[] ist ein richtiger Ansatz.
    Den verfolgst Du dann aber leider nicht weiter. Alle Post-Parameter des Formulars aus HTML werden im PHP-Script (neuerer Versionen) im Array $_POST bereitgetellt.

    Diese Datenbindung ermöglicht eine gemeinsame Datenhaltung, -Verarbeitung und -Kontrolle.

    Greife also auch auf $_POST['email'], $_POST['eintrag'] usw. zu.

    Die übernommenen Daten müssen aber dringend noch überprüft werden.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

  2. Hi,
    ergänzend zu Tom:

    hat aber mein Problem zwar gelöst, aber nur, indem ich in der PHP.ini die register_globals = On gesetzt habe.

    was aber nicht sinnvoll ist, wie Du ja wohl erkannt hast.

    "<input type="hidden" name="abgesendet" value="1" />

    warum das? Ein Formular sollte über einen Submit-Button abgesendet werden.

    Email:<br>
    <input type="text" name="email" size="47"><br>

    Du kennst das label-Element offenbar noch nicht.

    $eintrag = ereg_replace("\n","<br>",$eintrag);

    abgesehen davon, dass Du hierfür str_replace verwenden solltest, bitte nicht an dieser Stelle. Du solltest die Originaldaten speichern und erst für die Ausgabe passend aufbereiten. Und natürlich $_POST['eintrag'] abfragen.

    $eintrag = stripslashes($eintrag);

    s.o. - außerdem solltest Du - wenn magic_quotes_gpc aktiviert sein sollte - mit addslashes() das Gegenteil tun, nämlich den Originalzustand der Eingabe wiederherstellen.

    $daten = "<hr><b>Name:</b> $name<br>

    s.o. - warum willst Du Dich bei der Datenspeicherung auf eine bestimmte Ausgabe festlegen? Was wenn Du irgendwann keine <hr> mehr ausgeben willst oder auf XHTML umsteigst?
    Abgesehen davon: für eine Ausgabe fehlt hier htmlspecialchars().

    <b>Email:</b> <a href=mailto:$email>$email</a><br>

    s.o. - davon abgesehen eröffnest Du über die Verlinkung von ungeprüften Eingaben tolle Manipulationsmöglichkeiten; stell Dir vor, ich gebe bei email einen Javascript-Code ein. Und außerdem fehlen hier auch noch die Quotes.

    <b>Internetseite:</b> <a href=$url>$url</a><br>

    s.o.

    fwrite($datei,$daten);

    was ist, wenn zwischenzeitlich ein anderer Besucher sein Formular abgeschickt hat? Chaos - dass Du über flock() vermeiden solltest.

    Zu guter letzt solltest Du Dir dringend Gedanken über SPAM machen.

    freundliche Grüße
    Ingo