Paul: if/else Anfängerfrage

Hallo zusammen!

Ich bin ein absoluter PHP-Anfänger und habe mir ein Skript für eine Gästeliste zusammengestückelt.
Hab jetzt 2 Fragen dazu:

1. komme ich mit diesem if/else nicht klar. Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?
2. kann ich die Funktion noch einfacher aufrufen, als über "gaeste.php?eintragen=yes"?

Wäre nett, wenn sich das mal jemand anschauen könnte.
Danke und schönen Sonntag noch!

Hier der Code:

<?
$script="gaeste.php";
if ($eintragen){
eintragen($name, $script);
}
function eintragen($name, $script){
if (isset($name)){
$datei = "test.txt";
$fp = fopen ($datei, "a");
fwrite($fp," ".$name);
fclose($fp);
echo "Du hast dich erfolgreich in die G&auml;steliste eingetragen.";
}
else{
echo "Du hast keinen Namen eingetragen.";
}
}
?>
<form method="post" action="<? echo $script; ?>?eintragen=yes">
Name: <input type="text" name="name">
<input type="submit" value="Ich bin dabei!">
</form>
Folgende Leute haben sich eingetragen:
<?
$datei = "test.txt";
$fp = fopen ($datei, "r");
$str = fread ($fp, filesize ($datei));
fclose ($fp);
echo $str;
?>

  1. Hallo,

    1. komme ich mit diesem if/else nicht klar. Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?

    Erstmal ist in deinem Script eine Sicherheitslücke. Du hast das REGISTER_GLOBALS anscheinend aktiviert. Du wirst zwar wahrscheinlich nicht die Möglichkeit haben die PHP.ini deines Anbieters zu ändern, aber schreibe lieber am Anfang des Scriptes noch
    $name = $_POST['name']. Zu deiner Frage:
    Benutze statt if (isset($name)){..} lieber if (isset($name) && $name != ''){..}

    Danke und schönen Sonntag noch!

    Dir auch ;)

    Willi

    --
    Mein SelfCode: ie:{ fl:| br:> va:) ls:? fo:| rl:? n4:? ss:| de:> js:| ch:? sh:( mo:? zu:}
    1. echo $begrüßung;

      ... schreibe lieber am Anfang des Scriptes noch
      $name = $_POST['name']. Zu deiner Frage:

      Dieses Umkopieren ist nicht empfehlenswert. Zum einen ist es unnötig, da man ebensogut auf $_POST['name'] zugreifen kann. Zum anderen verschleiert es die Herkunft des Variableninhalts. Bei der Notation von $_POST im Script ist sofort zu sehen, dass es sich hierbei um eine Benutzereingabe handelt, die ungeprüfte und möglicherweise schädliche Daten enthalten kann. Bei $name ist die Herkunft des Inhalts nicht mehr offensichtlich zu erkennen.

      Benutze statt if (isset($name)){..} lieber if (isset($name) && $name != ''){..}

      Das wäre Blödsinn. Zuerst legst du mit deiner obigen Umkopierempfehlung die Variable $name an und prüfst dabei nicht ob die Quelle, aus der du den Inhalt zu nehmen gedenkst, überhaupt vorhanden ist, und dann prüfst du, ob die Variable $name angelegt ist. Natürlich ist sie das. Aber die Idee ist nicht abwegig, wenn man sie richtig ausführt:

      if (!isset($_POST['name']) or strlen(trim($_POST['name'])))
        // Fehler. Formular nicht abgesendet oder Feld nicht oder nur mit Leerzeichen ausgefüllt

      Hier sind sicher noch weitere Inhaltsprüfungen erforderlich. Z.B.: Wenn der eingegebene Wert einen Zeilenumbruch enthält gelangt dieser natürlich beim Schreiben in die Datei mit in selbige. Das wird kaum gewollt sein, da man pro Gast nur eine Zeile haben möchte. Ebenso sind Einträge wie "http://www.example.com/" keine hierzulande üblichen Namen für Personen ...

      echo "$verabschiedung $name";

      1. Hallo dedlfix.

        ... schreibe lieber am Anfang des Scriptes noch
        $name = $_POST['name']. Zu deiner Frage:

        Dieses Umkopieren ist nicht empfehlenswert. Zum einen ist es unnötig, da man ebensogut auf $_POST['name'] zugreifen kann. Zum anderen verschleiert es die Herkunft des Variableninhalts.

        Und des weiteren wird damit der Speicherbedarf verdoppelt, oder nicht?

        Einen schönen Sonntag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
  2. echo $begrüßung;

    1. komme ich mit diesem if/else nicht klar. Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?

    Definiere "funktioniert nicht"! Hast du dir die Inhalte der Variablen ausgegeben, und mit dem von dir erwarteten Wert verglichen? echo, print(), var_dump() und print_r() sind dafür geeignete Mittel. (Man kann damit auch die Ergebnisse von Ausdrücken anzeigen lassen, die man z.B. in der if-Anweisung verwendet hat.) Hast du den Wert für das error_reporting mal auf E_ALL gestellt, um auch Zugriffe auf nicht vorhandene Variablen anzeigen zu lassen? Gehst du vielleicht davon aus, dass ein veraltetes Feature namens register_globals aktiv ist? Befrage dazu phpinfo(). Wenn du davon ausgehst, vergiss diese Methode wieder und verwende die Superglobalen Arrays.

    1. kann ich die Funktion noch einfacher aufrufen, als über "gaeste.php?eintragen=yes"?

    PHP kennt keinen interaktiven Modus. Du kannst nur komplette Scripte laufen lassen.

    echo "$verabschiedung $name";

  3. Hallo,

    1. komme ich mit diesem if/else nicht klar. Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?

    Was genau funktioniert nicht? wird immer eingetragen? Du solltest statt mit isset() besser mit empty() abfragen, ob das Feld leer ist.

    1. kann ich die Funktion noch einfacher aufrufen, als über "gaeste.php?eintragen=yes"?

    Ja. Du übergibst deine Daten aus dem Formular mit POST (method="post"), wieso möchtest du dann noch eine Variable per GET übergeben. Beim Absenden verschickst du doch schon alle nötigen Informationen (Stichwort: Submitbutton).

    Gruß
    Carl

    1. Hallo Carl.

      Du solltest statt mit isset() besser mit empty() abfragen, ob das Feld leer ist.

      Und davor per isset() überprüfen, ob der jeweilige Schlüssel überhaupt gesetzt ist, sonst hagelt es Notices.

      Einen schönen Sonntag noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. Hallo Mathias,

        Und davor per isset() überprüfen, ob der jeweilige Schlüssel überhaupt gesetzt ist, sonst hagelt es Notices.

        Auf der Entwicklungsebene vielleicht (wobei auch das die Datei vergrößert), aber im Einsatz sollte der Server besser so konfiguriert sein, dass keinerlei automatische Fehlermeldungen an den User weitergegeben werden. Und Notices kann man dann imho sowieso ignorieren.

        Gruß
        Carl

        1. Hallo Carl.

          Und davor per isset() überprüfen, ob der jeweilige Schlüssel überhaupt gesetzt ist, sonst hagelt es Notices.

          Auf der Entwicklungsebene vielleicht (wobei auch das die Datei vergrößert), aber im Einsatz sollte der Server besser so konfiguriert sein, dass keinerlei automatische Fehlermeldungen an den User weitergegeben werden.

          Sehe ich auch so.

          Und Notices kann man dann imho sowieso ignorieren.

          Meiner Meinung nach sollte man das eben gerade nicht tun. Dazu sind sie ja da.

          Einen schönen Sonntag noch.

          Gruß, Mathias

          --
          ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
          debian/rules
        2. hi,

          Und davor per isset() überprüfen, ob der jeweilige Schlüssel überhaupt gesetzt ist, sonst hagelt es Notices.

          Auf der Entwicklungsebene vielleicht (wobei auch das die Datei vergrößert),

          Saubere Programmierung "vergrößert" nicht, ist kein optionales Extra, sondern absolute Notwendigkeit.
          Ohen wird ein Script nicht "kleiner", sondern nur schlechter.

          aber im Einsatz sollte der Server besser so konfiguriert sein, dass keinerlei automatische Fehlermeldungen an den User weitergegeben werden.

          Natürlich, falls irgendein Fall im Testing nicht berücksichtigt wurde, geht das den Nutzer trotzdem nichts an - zumindest nicht in Form einer PHP-Meldung. Das könnte sogar eine potentielle Schwachstelle darstellen, da es dem Nutzer mehr über die Struktur verrät, als er wissen sollte.

          Und Notices kann man dann imho sowieso ignorieren.

          Nein, keineswegs.
          Es sei denn, man gibt sich mit "es funzt aber" zufrieden, und legt auf sauberen und guten Code keinen Wert.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Hallo Paul,

    Ich bin ein absoluter PHP-Anfänger und habe mir ein Skript für eine Gästeliste zusammengestückelt.

    wir haben alle mal klein angefangen. :-)

    1. komme ich mit diesem if/else nicht klar.

    Hmm. So kompliziert ist das doch gar nicht.

       if (bedingung)  
        { anweisung;     // falls bedingung zutrifft  
        }  
       else  
        { anweisung      // falls bedingung NICHT zutrifft  
        }
    

    Es soll nur etwas in eine Datei geschrieben werden, wenn das Formularfeld auch ausgefüllt wurde, ansonsten soll gar nichts passieren. Wieso funktioniert das bei mir nicht?

    "Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Deinen Programmcode hast du unten angegeben, und ich ahne, wo das Problem liegt. Aber grundsätzlich: Beschreibe genau, *was* wirklich passiert, oder *was nicht* passiert, obwohl du es erwartest.

    1. kann ich die Funktion noch einfacher aufrufen, als über "gaeste.php?eintragen=yes"?

    Ja, du fährst mit deinem Beispiel zweigleisig. Dazu gleich mehr.

    <?

    Stolperfalle! Beginne die PHP-Abschnitte grundsätzlich mit <?php und vermeide die "Short Open Tags". Dieses Feature ist nämlich nicht bei allen Hostern verfügbar (und *meiner Ansicht nach* auch schlechter Stil).

    $script="gaeste.php";

    Das ist überflüssig. Seinen eigenen Namen hat Script jederzeit selbst zur Verfügung. So schaffst du nur eine mögliche Fehlerquelle, wenn du später mal den Namen des Scripts änderst und vergisst, diese Stelle im Code anzupassen.

    if ($eintragen){

    Wo hast die Variable $eintragen her? Fällt die vom Himmel?
    Ja, früher war es mal üblich, dass man per GET oder POST übergebene Daten gleich als Variablen im Script zur Verfügung hatte. Das ist aber unsauber, birgt Fehlerquellen und Risiken, und deshalb wird dringend davon abgeraten. Bei vielen Hostern ist dieses zweifelhafte "Feature" daher schon abgestellt.

    Stattdessen frage bitte die übergebenen Parameter direkt ab. Dazu solltest du dich aber mal für *eine* Art der Übergabe entscheiden, momentan nutzt du noch GET und POST gleichzeitig. Hier erscheint mir POST angemessen, also:

    if (isset($_POST['eintragen'])) ...

    Ich habe hier nicht nur den Wert des Parameters abgefragt, sondern dessen Vorhandensein. Das ist sinnvoll, damit das Script keine Fehlermeldung auswirft, wenn der Wert fehlt, sondern einfach still gar nichts tut.

    eintragen($name, $script);

    Für $name gilt dasselbe, was ich für $eintragen schon erwähnte, und den Scriptnamen benutzt du innerhalb der Funktion gar nicht. Weg damit! Und für $name wollen wir einen Ersatzwert vorsehen, falls der Parameter fehlt. Also:

    $name = (isset($_POST['name']) ? $_POST['name'] : "");
     eintragen($name);

    Hier wird also erst abgefragt, ob $_POST['name'] existiert, und falls ja, dessen Wert an $name zugewiesen, andernfalls ein Leerstring.
    Natürlich muss dann der Funktionskopf auch dementsprechend gekürzt werden:

    function eintragen($name)

    if (isset($name))

    Dadurch, dass wir eingangs dafür gesorgt haben, dass $name auf jeden Fall existiert, können wir hier auf dessen Wert abfragen:

    if ($name)

    $datei = "test.txt";
    $fp = fopen ($datei, "a");
    fwrite($fp," ".$name);
    fclose($fp);

    Gut, das sieht soweit richtig aus - man könnte das jetzt beliebig mit einer Fehlerbehandlung aufrüsten (Fehler beim Öffnen der Datei, beim Schreiben in Datei), aber für den Anfang mag das zunächst mal funktionieren. Kleiner Tipp am Rande: Schreib doch jeden Eintrag in eine neue Zeile, indem du am Ende des Eintrags einen Zeilenumbruch setzt:

    fwrite($fp, $name . "\n");

    <form method="post" action="<? echo $script; ?>?eintragen=yes">

    Hier fehlt erstes das gesamte Grundgerüst für eine gültige HTML-Datei, zweitens ist dieses Formular in der Form unsinnig. Du definierst method="post", hängst aber den Paramter ?eintragen=yes in jedem Fall schon als GET-Parameter mit an. Wie gesagt: Entscheide dich für *eine* Art der Übergabe; bleiben wir mal bei POST.

    <form method="post" action="">

    Das action-Attribut darf leer sein, das ist sogar eine recht elegante Methode, damit das Script sich selbst wieder aufruft (und das hast du ja vorher um drei Ecken auch getan).

    <?

    Siehe oben: Short Open Tag.

    $datei = "test.txt";
    $fp = fopen ($datei, "r");
    $str = fread ($fp, filesize ($datei));
    fclose ($fp);
    echo $str;

    Wenn du meinen Tipp von vorher (neue Zeile für jeden Eintrag) aufgreifen möchtest, musst du den Zeilenumbruch \n im String auch noch in einen HTML-Zeilenumbruch wandeln. Dafür bringt PHP eine Standardfunktion mit:

    echo nl2br($str);

    Da könnte man natürlich noch viel ergänzen, verbessern und variieren. Aber das möchtest du sicher selbst mit der Zeit herausfinden. Denk auch dran, ab und zu erstmal im PHP-Manual nachzulesen. Nicht nur die Beschreibungen der einzelnen Themen und Funktionen, sondern auch die Userkommentare sind manchmal hochinteressant.

    So long,
     Martin

    --
    Der Bäcker schlägt die Fliegen tot
    Und macht daraus Rosinenbrot.
    1. echo $begrüßung;

      $datei = "test.txt";
      $fp = fopen ($datei, "a");
      fwrite($fp," ".$name);
      fclose($fp);

      Gut, das sieht soweit richtig aus - man könnte das jetzt beliebig mit einer Fehlerbehandlung aufrüsten (Fehler beim Öffnen der Datei, beim Schreiben in Datei), aber für den Anfang mag das zunächst mal funktionieren.

      Nein, nein, nein, *kopfschüttel*, sowas sollte man gar nicht erst einreißen lassen. Wichtig, gerade für Anfänger, ist es, im Handbuch nachzuschlagen, was für ein Ergebnis eine Funktion zurückliefert. Viele Funktionen liefern im Gutfall das Gewünschte und im Fehlerfall etwas anderes, meist false. Darauf sollte man geeignet reagieren. Nachfolgende Funktionen können mit einem false meist nichts rechtes anfangen, und sinnvoll ist es ebenfalls nicht, einfach im Text weiterzumachen, als ob nichts wäre.

      if ($fp = fopen('test.txt', 'a')) {
        ...
      } else
        // Maßnahmen im Fehlerfall

      (Nebenbei: Wenn man den Dateinamen nur ein einziges Mal benötigt, und er ein fester String ist, muss man dafür nicht extra eine Variable anlegen.)

      echo "$verabschiedung $name";

      1. Hi,

        (Nebenbei: Wenn man den Dateinamen nur ein einziges Mal benötigt, und er ein fester String ist, muss man dafür nicht extra eine Variable anlegen.)

        Kann aber in soweit besser sein, da die Datei uu später erweitert wird und der Name mehrmals benötigt wird. Bevor man dann irgendwann mal alle Stellen, an denen der Name verwendet wird ändern muss, weil man einen anderen Dateinamen hat, kann man eigentlich auch einfach immer von Anfang an sowas in einer Variablen speichern.

        Gruß
        Carl

        1. Hallo Carl.

          (Nebenbei: Wenn man den Dateinamen nur ein einziges Mal benötigt, und er ein fester String ist, muss man dafür nicht extra eine Variable anlegen.)

          Kann aber in soweit besser sein, da die Datei uu später erweitert wird und der Name mehrmals benötigt wird. Bevor man dann irgendwann mal alle Stellen, an denen der Name verwendet wird ändern muss, weil man einen anderen Dateinamen hat, kann man eigentlich auch einfach immer von Anfang an sowas in einer Variablen speichern.

          Oder, worauf dedlfix sicher hinaus wollte, eine Konstante.

          Einen schönen Sonntag noch.

          Gruß, Mathias

          --
          ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
          debian/rules
          1. Hi,

            Oder, worauf dedlfix sicher hinaus wollte, eine Konstante.

            Ok, dann habe ich das nur falsch verstanden, da ich im Normalfall Konstanten einfach als eine besondere Art von Variablen ansehe.

            Gruß
            Carl

        2. echo $begrüßung;

          (Nebenbei: Wenn man den Dateinamen nur ein einziges Mal benötigt, und er ein fester String ist, muss man dafür nicht extra eine Variable anlegen.)

          Kann aber in soweit besser sein, da die Datei uu später erweitert wird und der Name mehrmals benötigt wird. Bevor man dann irgendwann mal alle Stellen, an denen der Name verwendet wird ändern muss, weil man einen anderen Dateinamen hat, kann man eigentlich auch einfach immer von Anfang an sowas in einer Variablen speichern.

          Ja, richtig, deshalb fing meine Anmerkung ja auch mit einer Einschränkung an. Ich schätzte Pauls Vorhaben so ein, dass er diesen Wert in diesem Script kein zweites Mal benötigt. (Konstanten benötigt man bei solch kleinen Wald- und Wiesen-Scripten auch nicht unbedingt. Die sind eher für größere Projekte interessant.)

          echo "$verabschiedung $name";

  5. Danke für die vielen Antworten!

    Nachdem ihr mich so nett mit eurer Informationsflut getränkt habt, habe jetzt versucht, eure ganzen Verbesserungsvorschläge reinzubasteln. Mit dem Erfolg, dass es jetzt einen "parse eror on line 2" gibt, den ich nicht rausbekomme.
    Vielleicht kann mir das nochmal bitte jemand geradebiegen.
    Ich muss sagen, dass das Meiste für mich noch totales Kauderwelsch ist. Richtig "verstehen" tue ich nur die Dateioperationen.
    Und eine Frage hätte ich dann noch. Wie kann ich es vermeiden, dass jemand HTML-Tags in das Formular eingibt und die dann womöglich meine Seite kaputt machen?

    Paul

    <?php
    $name = (isset($_POST["name"]) or strlen(trim($_POST["name"]))) ? $_POST["name"] : "");
    eintragen($name);

    function eintragen($name)
    {
    if($name)
    {
    $fp = fopen("test.txt", "a");
    fwrite($fp, $name. "\n");
    fclose($fp);
    echo "Du hast dich erfolgreich in die G&auml;steliste eingetragen.";
    }
    else
    {
    echo "Du hast keinen Namen eingetragen.";
    }
    }
    ?>

    <form method="post" action="">
    Name: <input type="text" name="name">
    <input type="submit" value="Ich bin dabei!">
    </form>

    Folgende Leute haben sich eingetragen:

    <?php
    $fp = fopen("test.txt", "r");
    $str = fread($fp, filesize ($datei));
    fclose($fp);
    echo nl2br($str);
    ?>

    1. hi,

      Mit dem Erfolg, dass es jetzt einen "parse eror on line 2" gibt, den ich nicht rausbekomme.

      $name = (isset($_POST["name"]) or strlen(trim($_POST["name"]))) ? $_POST["name"] : "");

      Aber zählen kannst du doch?

      $name =  
         (  
            isset  
               (  
                  $_POST["name"]  
               )  
         or  
            strlen  
               (  
                  trim  
                     (  
                        $_POST["name"]  
                     )  
               )  
            )  
         ?  
            $_POST["name"]  
         :  
            ""  
         );
      

      Dann zähle mal die öffnenden und schließenden runden Klammern.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
    2. echo $begrüßung;

      Und eine Frage hätte ich dann noch. Wie kann ich es vermeiden, dass jemand HTML-Tags in das Formular eingibt und die dann womöglich meine Seite kaputt machen?

      Sowas nennt man dann Cross Site Scripting (XSS), wenn jemand beliebigen Code in die Seite einschmuggeln kann. Der Programmierer hat an dieser Stelle den Kontextwechsel übersehen: Die Daten in einem String sollen in den Kontext HTML gebracht werden. Was muss man bei HTML beachten? Man muss HTML-eigene Zeichen maskieren. Das ist eigentlich schon alles. PHP stellt dafür die Funktion htmlspecialchars() bereit. Alle Daten, die du in einen HTML-Code einfließen lassen möchtest, solltest du damit behandeln.

      Damit kommt beispielsweise ein <script> im Browser des Benutzers als &lt;script&gt; an und wird von ihm als <script> angezeigt, und nicht als Script-Element angesehen und entsprechend behandelt. Damit ist die Angelegenheit zwar entschärft, aber unschön sieht das trotzdem aus. Wenn du genau weißt, dass nur bestimmte Zeichen in einer Eingabe sinnvollerweise vorkommen dürfen - beispielsweise < und > in einem Namen nicht vorkommen - dann solltest du solche Werte bei der Entgegennahme prüfen und ablehnen. Gib das Eingabeformular zusammen mit den fehlerhaften Werten (htmlspecialchars-Behandlung nicht vergessen!) solange wieder an den Beutzer zurück, bis du mit seinen Eingabedaten zufrieden bist. Diese Technik nennt man auch Affenformular.

      Eine andere Möglichkeit wäre, einfach ohne zu fragen alle "bösen" Zeichen zu entfernen. (Ich mag diesen Ansatz aber nicht, weil der Benutzer nicht nachvollziehen kann, warum seine Eingabedaten verändert werden.) strip_tags() entfernt schon mal alle HTML-Tags. Allerdings arbeitet es zu gründlich und entsorgt sämtliche zwischen < und > stehende Zeichen, auch das < 5 > in einer Formel wie 3 < 5 > 4. Das wäre nicht in jedem Fall gewollt.

      echo "$verabschiedung $name";

      1. Hallo dedlfix.

        strip_tags() entfernt schon mal alle HTML-Tags. Allerdings arbeitet es zu gründlich und entsorgt sämtliche zwischen < und > stehende Zeichen, auch das < 5 > in einer Formel wie 3 < 5 > 4. Das wäre nicht in jedem Fall gewollt.

        Sicher?

        echo strip_tags('Unglaublich: 3 < 5 > 4');

        Die Zeichenkette wird hier nicht angerührt.

        Einen schönen Sonntag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules
        1. echo $begrüßung;

          strip_tags() entfernt schon mal alle HTML-Tags. Allerdings arbeitet es zu gründlich und entsorgt sämtliche zwischen < und > stehende Zeichen, auch das < 5 > in einer Formel wie 3 < 5 > 4. Das wäre nicht in jedem Fall gewollt.

          Sicher?
          echo strip_tags('Unglaublich: 3 < 5 > 4');
          Die Zeichenkette wird hier nicht angerührt.

          Da ich strip_tags() nicht verwende, fehlt mir hier die Erfahrung. Nehmen wir das Leerzeichen zwischen < und 5 raus, funktioniert das Vielfraß-Verhalten wieder.

          echo "$verabschiedung $name";

    3. Hi Paule,

      sobald du das Klammernproblem in Zeile 2 durch Nachzählen und Korrigieren gelöst hast, befindet sich in deinem Skript noch ein Fehler.

      In dem Bereich, der den Inhalt der Textdatei ausgibt, wird innerhalb von fread() in der Funktion filesize() auf die Variable $datei zugegriffen, die nirgends vorher definiert wurde.

      $fp = fopen("test.txt", "r");
      $str = fread($fp, filesize ($datei));
      fclose($fp);
      echo nl2br($str);

      In deiner ersten Version war ja da der Skript-Name drin, was aber hier auch falsch wäre. Die Funktion fread() will wissen, wieviel Bytes sie auslesen soll, deshalb soll als zweiter Parameter die Dateigröße der Quelldatei angegeben werden. Die Quelldatei ist test.txt, denn diese soll ja ausgelesen werden. Also ändere die zweite Zeile in diesem Block so:

      $str = fread($fp, filesize ("test.txt"));

      Kleine Zusatz-Anregung:
      -----------------------

      Jetzt steht "test.txt" schon 3 mal in deinem Skript, also lohnt sich der Einsatz einer Variablen. Du könntest z.B. am Anfang deines Skriptes eine entsprechende Variable anlegen:

      $namensdatei = "test.txt";

      Dann greifst du später immer auf diese Variable zu, wenn du den Dateinamen deiner Speicherdatei benötigst.

      $fp = fopen($namensdatei, "r");
      $str = fread($fp, filesize ($namensdatei));
      fclose($fp);
      echo nl2br($str);

      So kannst du jederzeit den Dateinamen der Speicherdatei ändern, indem nur an einer Stelle im Skript etwas umtragen musst.

      Allerdings müsstest du auch in deiner Funktion "eintragen()" den Dateinamen mit der Variablen angeben. Nur ist die am Anfang definierte Variable nicht in der Funktion verfügbar, da dort keine einfachen Variablen von außen gelten. Du müsstest diese Variable mit in die Funktionparameter mit aufnehmen.

      function eintragen($name,$namensdatei)
      {
      if($name)
      {
      $fp = fopen($namensdatei, "a");
      fwrite($fp, $name. "\n");
      fclose($fp);
      echo "Du hast dich erfolgreich in die G&auml;steliste eingetragen.";
      }
      else
      {
      echo "Du hast keinen Namen eingetragen.";
      }
      }

      Die Funktion muss dann auch mit zwei Parametern aufgerufen werden, also:

      eintragen($name,$namensdatei);

      Falls dir das alles zuviel war, dann ignoriere alles ab "Kleine Zusatz-Anregung". Ich hatte um 1.00 Uhr nachts halt nichts anderes zu tun und hab mich einfach mal ausgelassen.

      Gute Nacht
      Max Smily