Richard: Fehler im Lernbuch ?!

Habe folgenden Code so aus einem Lernbuch abgeschrieben und bestimmt 20 mal auf seine Richtigkeit überprüft. Doch wenn ich das Formular abschicke, passiert nichts. Lösch ich allerdings den Teil :
"$allesklar = TRUE;
}
else
}
$allesklar = FALSE;
}"
überträgt er den Text in die gbook.txt, gibt allerdings einen Fehler auf der 2. Seite aus.
Vielleicht hat ja mal wer Lust sich den Code anzugucken, wäre sehr nett.

---
gbook1.php :

<html>
 <head>
  <title>Guestbook</title>
 </head>
<body>
<form action="gbook2.php" method="post">
 <p>Geben Sie Ihre Email-Adresse ein :</p>
  <input type="text" size=20 name="Email">
   <br>
   <br>
 <p>Geben Sie hier Ihren Namen ein :</p>
  <input type="text" size=20 name="Name">
   <br>
   <br>
 <p>Geben Sie hier Ihren Kommentar ein :</p>
  <textarea cols=48 rows=10 name="Kommentar"></textarea>
   <br>
   <br>
   <input type="submit" value="Absenden">
   <input type="reset" value="Eingabe löschen" name="reset">
</form>

<?php
 // Liest Datei gbook.txt aus
 $datei = fopen ("gbook.txt", "r");
 while (!feof ($datei))
 {
 echo fgets ($datei,1000),"<br>";
 }
 fclose ($datei);
?>

</body>
</html>

---

gbook2.php

<?php
 function SchreibeDatei ($Email,$Name,$Kommentar)
 {
 // Feldinhalte werden in externe Datei gespeichert
 $datei = "gbook.txt";
 $Kommentar = strip_tags ($Kommentar);
 $Kommentar = htmlentities ($Kommentar);
 $Name = htmlentities ($Name);
 $oeffnen = fopen ($datei, "a");
  fwrite ($oeffnen,
  "<a href="mailto:$Email">$Name</a>\n$Kommentar\n<hr>\n");
  fclose ($oeffnen);
  $allesklar = TRUE;
  }
  else
  }
  $allesklar = FALSE;
  }
 }
 // Funktion endet hier
?>

<html>
<head>
<title>Guestbook</title>
</head>
<body>

<?php
 // Rueckmeldung fuer den Benutzer
 $CallFunction = SchreibeDatei ($Email,$Name,$Kommentar);
 if ($CallFunction)
 {
 print ("Danke für den Eintrag");
 }
 else
 {
 print ("Fehler, bitte noch einmal versuchen");
 }
?>

<p>
<a href="gbook1.php">Zurueck / Eintraege lesen</a></p>
</body>
</html>

  1. Hi,

    du hast Recht, da ist tatsächlich ein Fehler drin. Und zwar ist dieser $allesklar-Teil falsch geklammert:
    ...
    } else {
    ...
    }
    --> Wo ist das IF zu dem Else. Ich bin gerade etwas zu faul nachzugucken was fopen zurückgibt, aber vielleicht fehlt dort ein
    if ($oeffnen) {

    1. Geht leider auch nicht. :(

      1. Geht leider auch nicht. :(

        So muss es lauten
        if(fclose ($oeffnen));
          $allesklar = TRUE;
          }
          else
          }
          $allesklar = FALSE;
          }

        1. Must, noch ein Fehler:

          if(fclose ($oeffnen))
          {
            $allesklar = TRUE;
          }
          else
          }
            $allesklar = FALSE;
          }

          1. Must, noch ein Fehler:

            if(fclose ($oeffnen))
            {
              $allesklar = TRUE;
            }
            else
            }
              $allesklar = FALSE;
            }

            Auch wenn ich das einbaue gehts noch nicht.
            Auch dieser Code, den ich woanders gefunden habe, geht nicht... hat sonst noch jemand eine Idee, woran es liegen könnte ?

            if(fclose ($oeffnen))
            {
            $allesklar = TRUE;
            }
            else
            }
            $allesklar = FALSE;
            }
            return $allesklar;

            1. Hallo Richard,

              Auch dieser Code, den ich woanders gefunden habe, geht nicht...

              Du wirst nicht weit kommen, wenn du dich nicht mit den Basics der Sprache befasst und nur irgendwelchen Code zusammenkopierst, den du nicht verstehst.

              if(fclose ($oeffnen))
              {
              $allesklar = TRUE;
              }
              else
              }
              $allesklar = FALSE;
              }
              return $allesklar;

              Es ist nun wirklich nicht schwer, sich zwei Stunden hinzusetzen und mal alles ueber Klammerung und if-Bedingungen nachzulesen. In deinem Fall sind die Klammern gar nicht noetig, weil nur jeweils eine Anweisung vom if und vom else abhaengt. Also einfach:

              if(fclose ($oeffnen))
               $allesklar = TRUE;
              else
               $allesklar = FALSE;
              return $allesklar;

              Und bitte nimm dir den Ratschlag zu Herzen: erst verstehen, dann programmieren!

              viele Gruesse
                Stefan Muenz

              1. Hallo Stefan,

                In deinem Fall sind die Klammern gar nicht noetig, weil nur jeweils eine Anweisung vom if und vom else abhaengt. Also einfach:

                if(fclose ($oeffnen))
                $allesklar = TRUE;
                else
                $allesklar = FALSE;
                return $allesklar;

                Du hast natürlich recht damit, daß man hier prinzipiell die geschweiften
                Klammern weglassen könnte. Allerdings halte ich diesen "Tipp" für mehr
                als zweifelhaft. Die Lesbarkeit vermindert sich enorm, wohingegen die
                Chance (später) einen schwer auffindbaren Fehler zu machen ganz
                erheblich steigt. Um zu erkennen, daß nachfolgendes Konstrukt nicht
                das macht, was es eigentlich soll, muß man schon genau hinschauen:

                if(fclose ($oeffnen))
                      $allesklar = TRUE;
                  else
                      $allesklar = FALSE;
                      $variable  = 42;
                  return allesklar;

                Der Fehler kommt meist dadurch zustande, daß vergessen wird die
                geschweiften Klammern nachträglich einzufügen, wenn mehr als eine
                Zeile nach dem else steht. Sind dort bereits geschweifte Klammern
                notiert, kann das natürlich nicht passieren.

                Die optimale Lösung wäre damit -- und so ist das auch in einigen
                Coding Style Guides nachzulesen -- die folgende:

                if (fclose($oeffnen)) {
                      $allesklar = TRUE;
                  } else {
                      $allesklar = FALSE;
                  }

                return allesklar;

                Oder noch besser:

                return fclose($oeffnen);

                ;-)

                Gruß
                Slyh