Chaosweib: Gästebuch - Wo ist der Fehler?

Hallo!

Ich habe nur ein kleinwenig Ahnung mit php-Sprache. Jedoch strenge ich mich sehr an. Hier sind meine Code:

gaestebuchtest.html:

...
<title>Gäsetbuchtest</title>
</head>
<body>
<form action="file:///C:/Homepage/Gaestebuchtest2/gb.php" method="post">
<table
style="width: 455px; height: 247px; text-align: left; margin-left: auto; margin-right: auto;"
border="1" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td>Name:</td>
</tr>
<tr>
<td><input size="40" maxlength="40" name="name"></td>
</tr>
<tr>
<td>Ihr Eintrag:</td>
</tr>
<tr>
<td><textarea rows="5" cols="50" name="eintrag"></textarea></td>
</tr>
<tr>
<td><input value="Absenden" type="submit"></td>
</tr>
</tbody>
</table>
</form>
...

gb.php:

...
<?php

$daten=$_POST[eintrag]."<br>von<br>"
$daten=$_POST[name]."<br><br>";

$eintragen = "eintragen.txt";

$datei = fopen($eintragen,"a");

fwrite($datei, $daten);

?>

Eintrag erfolgreich.

<a href="guestbook.php">Zurück zum Gästebuch</a>
...

guestbook.php:

...
<center><h2>Mein Gästebuch</h2>

<a href="gaestebuchtest.html">Ins Gästebuch eintragen</a></center>

<?php

$datenbank = "daten.dat"; $datei = fopen($datenbank,"r");

fpassthru($datei);

?>
...

Ich habe einen Teil der obige HTML-Code "gaestebuchtest.html" von diese http://de.selfhtml.org/perl/module/cgi.htm#formularverarbeitung@title=Seiteverwendet und die restliche php-Code habe ich von der phpbox.de geholt. So, ich habe ausgetestet, komme nicht weiter. Wenn ich auf die Schaltfläche "Absenden" klicke, kommt keine saubere Seite, dann erscheint so:

"von
" $daten=$_POST[name]."

"; $eintragen = "eintragen.txt"; $datei = fopen($eintragen,"a"); fwrite($datei, $daten); ?> Eintrag erfolgreich. Zurück zum Gästebuch"

Wo ist der Fehler?

Gruß Chaosweib

  1. Ich kann Dir schon mal sagen, was behoben werden muss:

    a) <form action="file:///C:/Homepage/Gaestebuchtest2/gb.php" method="post">

    Da ist als Pfad Deine Festplatte angegeben. Das ganze C:/-Gedöhns muss weg.

    b) Die Textdateien brauchen die richtigen Rechte, damit Daten in sie geschrieben werden können. 777 geht, kann aber sein, dass es mit 666 auch getan ist.

    Probier das mal, vielleicht reicht das schon.

    Gruß

    1. Hallo Friedel!

      b) Die Textdateien brauchen die richtigen Rechte, damit Daten in sie geschrieben werden können. 777 geht, kann aber sein, dass es mit 666 auch getan ist.

      Wo denn? Wo kann ich ändern?

      Gruß Chaosweib

      1. Hallo Chaosweib,

        b) Die Textdateien brauchen die richtigen Rechte, damit Daten in sie geschrieben werden können. 777 geht, kann aber sein, dass es mit 666 auch getan ist.

        Wo denn? Wo kann ich ändern?

        Unter der Annahme, dass es sich beim Webserver um einen
        entfernten Server handelt, der auf Linux/Unix o.ä. läuft
        und auf den Du per FTP zugreifst:
        Mach Dich schlau, wie Du in Deinem FTP-Client die Dateirechte
        setzen kannst. Das Stichwort lautet: CHMOD. Such z.B. so:
        http://www.google.com/search?q=chmod+ftp+[Name Deines FTP-Clients]

        Hintergrund-Infos:
        http://de.wikipedia.org/wiki/Chmod
        http://de.wikipedia.org/wiki/Unix-Dateirechte

        HTH, mfg
        Thomas

        1. Hallo Thomas!

          Unter der Annahme, dass es sich beim Webserver um einen
          entfernten Server handelt, der auf Linux/Unix o.ä. läuft
          und auf den Du per FTP zugreifst:
          Mach Dich schlau, wie Du in Deinem FTP-Client die Dateirechte
          setzen kannst. Das Stichwort lautet: CHMOD. Such z.B. so:
          http://www.google.com/search?q=chmod+ftp+[Name Deines FTP-Clients]

          Hintergrund-Infos:
          http://de.wikipedia.org/wiki/Chmod
          http://de.wikipedia.org/wiki/Unix-Dateirechte

          Genau, das mit dem Befehl "chmod" habe ich vor kurzem auf diese Seite gelesen.

          Vielen Dank für den Link. Werd nochmal ausprobieren. Also, stimmt meine Code fast alles?

          Liebe Grüße
          Chaosweib

          1. Hallo,

            Genau, das mit dem Befehl "chmod" habe ich vor kurzem auf diese Seite gelesen.

            Wie ChrisB schon geschrieben hat, brauchst Du _nicht_ mit PHP
            und der Funktion chmod() die Dateirechte zu setzen.
            (Dazu müsste die Datei überhaupt schon für PHP schreibbar sein.)

            Stattdessen empfehle ich Dir eben, mit dem FTP-Programm,
            mit dem Du die Dateien auf den Webserver hochlädst,
            die Rechte an der Text-Datei mit CHMOD zu setzen.
            Das ist viel einfacher und bequemer, und Du musst
            es nur einmal machen (nämlich nach dem Hochladen
            der Datei). Den PHP-Befehl chmod() brauchst Du nicht.

            mfg Thomas

            1. Hallo,

              Genau, das mit dem Befehl "chmod" habe ich vor kurzem auf diese Seite gelesen.

              Wie ChrisB schon geschrieben hat, brauchst Du _nicht_ mit PHP
              und der Funktion chmod() die Dateirechte zu setzen.
              (Dazu müsste die Datei überhaupt schon für PHP schreibbar sein.)

              Stattdessen empfehle ich Dir eben, mit dem FTP-Programm,
              mit dem Du die Dateien auf den Webserver hochlädst,
              die Rechte an der Text-Datei mit CHMOD zu setzen.
              Das ist viel einfacher und bequemer, und Du musst
              es nur einmal machen (nämlich nach dem Hochladen
              der Datei). Den PHP-Befehl chmod() brauchst Du nicht.

              mfg Thomas

              Ich habe einen winzigkleinen Fehler in der Code entdeckt!

              CHMOD hab ich weggelassen.

              <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
              <html>
              <head>
                <meta content="text/html;charset=ISO-8859-15"
               http-equiv="Content-Type">
              </head>
              <body>
              <?php
              $daten=$_POST[eintrag]."<br>von<br>" <---- ";" hat gefehlt!!!
              $daten=$_POST[name]."<br><br>";
              $eintragen = "eintragen.txt";
              $datei = fopen($eintragen,"a");
              fwrite($datei, $daten);
              ?>
              Eintrag erfolgreich.
              <a href="guestbook.php">Zurück zum Gästebuch</a>
              </body>
              </html>

              Dann hat es funktioniert! Jetzt auf der nächste Seite ist wieder ein Problem aufgetreten, aber das kriege ich schon im Griff.

              1. hallo,

                Dann hat es funktioniert! Jetzt auf der nächste Seite ist wieder ein Problem aufgetreten, aber das kriege ich schon im Griff.

                Setz mal nach <?php

                error_reporting(E_ALL);

                oder such dir was aus

                Guck dir die Fehlermeldungen an, die damit ausgegeben werden. Zumindest mit "on line n" kannst du den Fehler halbwegs lokalisieren.
                Geh dann zuerst die einfachsten Wege. Ist das Semikolon am Ende der Zeile vorhanden (wenn nötig) oder zuviel, hast du in Variablennamen Tipfehler,  oder oder oder.

                1. hallo,

                  Dann hat es funktioniert! Jetzt auf der nächste Seite ist wieder ein Problem aufgetreten, aber das kriege ich schon im Griff.

                  Setz mal nach <?php

                  error_reporting(E_ALL);

                  oder such dir was aus

                  Guck dir die Fehlermeldungen an, die damit ausgegeben werden. Zumindest mit "on line n" kannst du den Fehler halbwegs lokalisieren.
                  Geh dann zuerst die einfachsten Wege. Ist das Semikolon am Ende der Zeile vorhanden (wenn nötig) oder zuviel, hast du in Variablennamen Tipfehler,  oder oder oder.

                  Ok, werd auf jeden Fall probieren. Danke Dir für den Rat!

                  Liebe Grüße
                  Chaosweib

                  Ps.: Ich glaub, macht mir langsam Spass ^^.

                  1. Ich habe das fertige Gericht runtergeladen, könnt ihr auf meine Seite sehen, ist nicht alles fertig. Ich habe zwei Problempunkte. Das einem ist die Navigationsleiste. In der Navigationsleiste seht ihr die blaue Schrift, wenn ich mit dem Maus rüberfahre, zeigt rosa und dann hellgrün. Eigentlich soll es keine blaue Schrift zeigen, sondern es muss onmouseout="this.style.color='rgb(255, 204, 255)'" (rosa) und onmouseover="this.style.color='rgb(153, 255, 153)'" (hellgrün) stehen. Wie mache ich bloss die blaue Schrift weg?!?
                    Und das zweite Problem, wenn ich auf "Neuen Gästebucheintrag hinzufügen" klicke, sieht man aussenrum einen breiten, weissen Rahmen und das sieht nicht schön aus =(. Wie verkleinere ich ihn, daß er schön in der Mitte sitzt?

                    Gruß Chaosweib

                    1. Seite

                      Wie mache ich bloss die blaue Schrift weg?!?

                      Nutze CSS statt JS

                      Übrigens:
                      * = optionale Felder

                      ...ist gegen die Konvention, Pflichtfelder direkt nach dem label mit einem auffälligen Stern zu kennzeichnen.

                      <link> Elemente gehören in den Head, und

                      http://users.skynet.be/mgueury/mozilla/ gehört zu (d)einem Firefox.

                      Und das zweite Problem, wenn ich auf "Neuen Gästebucheintrag hinzufügen" klicke, sieht man aussenrum einen breiten, weissen Rahmen und das sieht nicht schön aus =(. Wie verkleinere ich ihn, daß er schön in der Mitte sitzt?

                      Kann ich nicht nachvollziehen.

                      mfg Beat

                      --
                      ><o(((°>           ><o(((°>
                         <°)))o><                     ><o(((°>o
                      Der Valigator leibt diese Fische
                      1. http://users.skynet.be/mgueury/mozilla/ gehört zu (d)einem Firefox.

                        Ah, Klasse. Genau, das brauch ich.

  2. hallo...

    dein code schaut ziemlich ungeparst aus bzw. du hast wohle kein php parser auf deinem computer.. desshalb wird dir nur der php code angezeigt.. also: php fähigen server beschaffen...
    lg

    1. hallo...

      dein code schaut ziemlich ungeparst aus bzw. du hast wohle kein php parser auf deinem computer.. desshalb wird dir nur der php code angezeigt.. also: php fähigen server beschaffen...
      lg

      Das stimmt.

      Es klappt immer noch nicht =(.
      Ihr könnt meine Seite http://damaris-creative-arts.de/Guestbooktest/gb.php testen. Schaut immer noch nicht so gut aus.

      Hier nochmal mein Code von gb.php:

      <?php

      $daten=$_POST[eintrag]."<br>von<br>"
      $daten=$_POST[name]."<br><br>";

      chmod ($eintragen.txt, 704);   <---- Ist das richtig?
      $eintragen = "eintragen.txt";

      $datei = fopen($eintragen,"a");

      fwrite($datei, $daten);

      ?>

      Eintrag erfolgreich.

      <a href="guestbook.php">Zurück zum Gästebuch</a>
      </body>
      </html>

      Ach apropo, mein ftp-Server gehört zu Hetzner Online. Die chmod Einstellung, dank an Thomas, den er mir den Link weiter geholfen hatte, habe ich diese Seite probiert, klappt irgendwie nicht.

      1. Hi,

        Es klappt immer noch nicht =(.

        Das taug als Problembeschreibung *gar* *nichts*.

        Ihr könnt meine Seite http://damaris-creative-arts.de/Guestbooktest/gb.php testen. Schaut immer noch nicht so gut aus.

        Dort meldet PHP den folgenden Fehler - warum zitierst du diesen nicht, statt nur "funzt nich" zu sagen?

        Parse error: syntax error, unexpected T_VARIABLE in /usr/www/users/damari/Guestbooktest/gb.php on line 13

        Hier nochmal mein Code von gb.php:

        Das kann nicht wirklich der Code sein - denn da müsste PHP schon früher einen Fehler melden -

        <?php

        $daten=$_POST[eintrag]."<br>von<br>"
        $daten=$_POST[name]."<br><br>";

        • weil hier das abschliessende Semikolon in der dritten Zeile fehlt.

        chmod ($eintragen.txt, 704);   <---- Ist das richtig?

        Selbst wenn der Wert passen sollte, ist es unsinnig, die Rechte bei jedem Scriptaufruf zu setzen - das macht man wenn überhaupt nötig ein mal, beim erstellen der Datei.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
  3. Hallo nochmal,

    $daten=$_POST[eintrag]."<br>von<br>"
    $daten=$_POST[name]."<br><br>";

    Der Schlüssel der Variablen muss in Anführungszeichen stehen:
    $_POST['name'] statt $_POST[name].
    Die 1. Zeile müsste mit einem Semikolon (;) aufhören.
    In der 2. Zeile überschreibst Du den Inhalt der Variable.
    Um weiteren Inhalt an eine String-Variable dranzuhängen,
    müsstest Du es mit .= schreiben, also so:

    $daten=$_POST['eintrag']."<br>von<br>";
    $daten.=$_POST['name']."<br><br>";

    Oder gleich so:
    $daten=$_POST['eintrag']."<br>von<br>".$_POST['name']."<br><br>";

    Allerdings ist das ganze Vorgehen sehr gefährlich.
    Du übernimmst einfach das, was der Benutzer eingibt,
    und schreibst es ohne Prüfung in die Daten-Datei,
    welche Du später ebenfalls ohne Prüfung den Besuchern
    auslieferst.

    Beschäftige Dich mal grundsätzlich mit dem Thema Sicherheit.
    Sinnvoll wäre zumindest mal ein strip_tags().
    Und damit gewisse Sonderzeichen (<,>,",&) am Ende
    (wenn das Gästebuch angezeigt wird) korrekt angezeigt
    werden, musst Du sie mit htmlspecialchars() umwandeln.

    /* Variablen putzen: */
    $eintrag2=htmlspecialchars(strip_tags($_POST['eintrag']));
    $name2=htmlspecialchars(strip_tags($_POST['name']));

    /* String, der gespeichert werden soll, zusammensetzen: */
    $daten="<p>Eintrag von $name2<br>$eintrag2</p>\n";

    $eintragen = "eintragen.txt";
    $datei = fopen($eintragen,"a");

    Hier fehlt eine saubere Fehlerbehandlung.

    Du musst zuerst kontrollieren, ob die Datei eintragen.txt
    überhaupt existiert und ob sie beschreibbar ist.
    Das erledigt die Funktion is_writable().
    Erst wenn diese Prüfung erfolgreich war,
    solltest Du die Datei mit fopen() öffnen.
    Und auch dann wieder: Testen ob das Öffnen und Schreiben
    erfolgreich war, andernfalls Fehlermeldung (oder so).

    Also z.B. so etwas (Code ungetestet):

    if (is_writable($eintragen))
      {
       $datei = fopen($eintragen,"a");
       if ($datei===false)
         { echo "Fehler - Datei konnte nicht geöffnet werden."; }
       else
         {
          if (fwrite($datei,$daten)===false)
             { echo "Fehler - Daten können nicht gespeichert werden."; }
          else
             { echo "Daten wurden erfolgreich gespeichert."; }
          fclose($datei);
         }
      }

    $datenbank = "daten.dat"; $datei = fopen($datenbank,"r");
    fpassthru($datei);

    Hier heisst die Daten-Datei plötzlich daten.dat - oben hiess sie
    eintragen.txt - das kann nicht gutgehen...
    Ausserdem ist $datenbank ein etwas unglücklicker Dateiname
    für eine normale Text-Datei...

    Auch hier wieder:
    Vor dem öffnen prüfen, ob die Datei überhaupt existiert - z.B.
    mit file_exists() - dann erst mit fopen() öffnen und mit
    fpassthru() den Inhalt durchschleusen.

    Alternativ könnte man den Inhalt auch mit readfile() ausgeben.
    (Das hat den Vorteil, dass man sich das fopen() sparen kann.)

    $ausgaberesultat=readfile($datenbank);
    if ($ausgaberesultat==false)
      { echo "Datei mit den Einträgen konnte nicht eingelesen werden."; }

    Wenn ich auf die Schaltfläche "Absenden" klicke, kommt keine saubere Seite, dann erscheint so:

    "von
    " $daten=$_POST[name]."

    "; $eintragen = "eintragen.txt"; $datei = fopen($eintragen,"a"); fwrite($datei, $daten); ?> Eintrag erfolgreich. Zurück zum Gästebuch"
    Wo ist der Fehler?

    Dein Webserver kann offenbar kein PHP, oder er wendet es zumindest
    bei dieser Datei (gb.php) nicht an.

    Wende Dich an Deinen Webhosting-Anbieter, um zu erfahren, was Du
    machen musst, damit PHP läuft.
    (Dir ist ja hoffentlich schon klar, dass PHP auf Deinem eigenen
    Rechner nicht funktioniert, es sei denn, Du hast dort drauf
    einen Webserver am laufen, der PHP kann...)

    HTH, mfg
    Thomas

  4. Moin!

    Ich habe nur ein kleinwenig Ahnung mit php-Sprache. Jedoch strenge ich mich sehr an.

    Das reicht aber noch nicht.

    Dein bisheriges Arbeitsergebnis ist gefährlich! Ich habe dir ein kleinwenig von der Gefährlichkeit gerade in Form eines netten Javascriptes in deine Seite integriert (der erste Versuch wurde von Magic Quotes vereitelt, aber das hält niemanden auf, wie du sehen solltest).

    Du hast den elementarsten Arbeitsschritt bei der Datenverarbeitung nicht beachtet: Kontextwechsel erfordern unter Umständen eine andere Darstellung für gewisse Zeichen.

    Dein bisher einziger Kontextwechsel ist von Text (im Texteingabefeld) zu HTML (in der Datenausgabe).

    Der verlinkte Artikel sagt dir, was zu tun ist. Lies ihn!

    Und entscheide dich eventuell doch lieber, ein fertiges Gästebuchskript einzusetzen und es "nur" anzupassen, wenn du es ernsthaft online einsetzen willst.

    Für deine Programmierexperimente hingegen solltest du deine Skripte niemals ohne Zugangskontrolle öffentlich online stellen. Entweder du installierst dir auf deinem eigenen Rechner z.B. XAMPP (Apache, PHP, Perl und MySQL), oder du erstellst auf deinem Online-Server wenigstens einen .htaccess-Verzeichnisschutz mit Passwort.

    - Sven Rautenberg

    1. Moin!

      Ich habe nur ein kleinwenig Ahnung mit php-Sprache. Jedoch strenge ich mich sehr an.

      Das reicht aber noch nicht.

      Dein bisheriges Arbeitsergebnis ist gefährlich! Ich habe dir ein kleinwenig von der Gefährlichkeit gerade in Form eines netten Javascriptes in deine Seite integriert (der erste Versuch wurde von Magic Quotes vereitelt, aber das hält niemanden auf, wie du sehen solltest).

      Du hast den elementarsten Arbeitsschritt bei der Datenverarbeitung nicht beachtet: Kontextwechsel erfordern unter Umständen eine andere Darstellung für gewisse Zeichen.

      Dein bisher einziger Kontextwechsel ist von Text (im Texteingabefeld) zu HTML (in der Datenausgabe).

      Der verlinkte Artikel sagt dir, was zu tun ist. Lies ihn!

      Und entscheide dich eventuell doch lieber, ein fertiges Gästebuchskript einzusetzen und es "nur" anzupassen, wenn du es ernsthaft online einsetzen willst.

      Für deine Programmierexperimente hingegen solltest du deine Skripte niemals ohne Zugangskontrolle öffentlich online stellen. Entweder du installierst dir auf deinem eigenen Rechner z.B. XAMPP (Apache, PHP, Perl und MySQL), oder du erstellst auf deinem Online-Server wenigstens einen .htaccess-Verzeichnisschutz mit Passwort.

      • Sven Rautenberg

      Vielen Dank, Sven. Ich werde nachher dein Text in aller Ruhe lesen, bin in moment beschäftigt.

      Liebe Grüße
      Chaosweib

    2. Moin!

      Ich habe nur ein kleinwenig Ahnung mit php-Sprache. Jedoch strenge ich mich sehr an.

      Das reicht aber noch nicht.

      Dein bisheriges Arbeitsergebnis ist gefährlich! Ich habe dir ein kleinwenig von der Gefährlichkeit gerade in Form eines netten Javascriptes in deine Seite integriert (der erste Versuch wurde von Magic Quotes vereitelt, aber das hält niemanden auf, wie du sehen solltest).

      Du hast den elementarsten Arbeitsschritt bei der Datenverarbeitung nicht beachtet: Kontextwechsel erfordern unter Umständen eine andere Darstellung für gewisse Zeichen.

      Dein bisher einziger Kontextwechsel ist von Text (im Texteingabefeld) zu HTML (in der Datenausgabe).

      Der verlinkte Artikel sagt dir, was zu tun ist. Lies ihn!

      Und entscheide dich eventuell doch lieber, ein fertiges Gästebuchskript einzusetzen und es "nur" anzupassen, wenn du es ernsthaft online einsetzen willst.

      Für deine Programmierexperimente hingegen solltest du deine Skripte niemals ohne Zugangskontrolle öffentlich online stellen. Entweder du installierst dir auf deinem eigenen Rechner z.B. XAMPP (Apache, PHP, Perl und MySQL), oder du erstellst auf deinem Online-Server wenigstens einen .htaccess-Verzeichnisschutz mit Passwort.

      • Sven Rautenberg

      So, ich hab dein Text alles durchgelesen und verstanden. Ja, die php-Sprache meines Wissens reicht nicht aus, hast du recht. Ich weiss, wie gefährlich das ist, war ja nur ein Test. Ich denke, sollte ich dann doch lieber ein fertiges Gästebuch holen. XAMPP hört sich interessant an, würd auf jeden Fall gern testen. Leider verwende ich keine gute Leitung und benutze gerade über das Mobilfunk Stick, da bei uns kein DSL verfügbar ist und somit kann ich kein XXAMP runterladen =(. Kuhkaff halts -.-.