Philipp: Kann keine neue Zeile in Text-Datei einfügen (-> Fehler inside)

Hallo,
 ich versuche eine neue Zeile mit Daten in eine Text-Datei zu schreiben.
Ich habe das Script lokal auf meinem WAMP und auf meinen Webserver (inkl CHMOD) ausprobiert.

Ich bekomme immer folgenden Fehler:
Warning: fputs(): supplied argument is not a valid stream resource in I:\www\txt\index.php on line 23
Warning: fclose(): supplied argument is not a valid stream resource in I:\www\txt\index.php on line 24

Der Code ist folgender:
---------------------------------------------------------------------
  $file = "wars.txt";

if ($_POST["save"]) {
    $clan  = $_REQUEST["clan"];
    $home  = $_REQUEST["home"];
    $enemy = $_REQUEST["enemy"];

if(isset($clan) && isset($home) && isset($enemy)) {
      $openfile = @fopen($file, "a+") || die("Die Datei konnte nicht gefunden werden!<br>");

$clan  = trim($clan);
      $home  = trim($home);
      $enemy = trim($enemy);

$data = "$clan|-|$home|-|$enemy|-|\n";

fputs($openfile, $data); # Zeile 23
      fclose($openfile); # Zeile 24

echo "Das eingegebene War wurde gespeichert!<br>";

}
    else {
      echo "Eingaben wurden ausgelassen. Keine Speicherung!<br>";
    }
  }
---------------------------------------------------------------------
Wo liegt der Fehler? ich habe keine Idee mehr.
Danke im Voraus.

MfG

  1. Moin Philipp

    Ich bekomme immer folgenden Fehler:
    Warning: fputs(): supplied argument is not a valid stream resource in I:\www\txt\index.php on line 23
    Warning: fclose(): supplied argument is not a valid stream resource in I:\www\txt\index.php on line 24

    das sind Folgefehler. Es gibt kein gültiges Dateihandle.
    Daher der Fehler bei fputs und bei fclose.

    @fopen($file, "a+") || die("Die Datei konnte fG

    schreibe mal diese Zeile ohne das @. Das @ unterdrückt die
    Fehlerausgabe. Das + nach dem a ist IMHO unnötig.

    Also mal so:

    fopen($file, "a")

    Dann gibt's auch eine schöne Fehlermeldung :-)

    regds
    Mike

    1. Danke für deine Antwort.

      schreibe mal diese Zeile ohne das @. Das @ unterdrückt die
      Fehlerausgabe. Das + nach dem a ist IMHO unnötig.

      Eine Fehlermeldung habe ich jetzt aber auch nicht weiter bekommen. Das + ist zum Erstellen der Datei, falls sie nicht existiert.

      fopen($file, "a")

      Ändert leider nichts. Alles wie vorher - auch die Fehlermeldung.

      Danke trotzdem. Vielleicht hast du noch eine Idee?

      1. Moin;

        fopen($file, "a")
        Ändert leider nichts. Alles wie vorher - auch die Fehlermeldung.

        Kein Fehler von fopen?

        Mal abgesehen davon, das deine Fehler Nachfolgefehler sind:

        ist der richtige Syntax von fopen

        fputs($handle, $data, strlen($data));

        Also:
        fputs($openfile, $data, strlen($data);

        das Attribut "a" legt auch eine neue Datei an, wenn sie nicht da
        ist, auch ohne "+"

        regds
        Mike

        1. Hi,

          Kein Fehler von fopen?

          Leider nein.

          Also:
          fputs($openfile, $data, strlen($data);

          Danke. Änderte aber ebenfalls gar nichts.

          das Attribut "a" legt auch eine neue Datei an, wenn sie nicht da
          ist, auch ohne "+"

          Ok, behalte ich im Hinterkopf. Danke.

          MfG

          1. Moin  Philipp,

            Kein Fehler von fopen?
            Leider nein.

            OK. So schnell geben wir nicht auf.
            Kannst Du die Datei lesen?

            $openfile = fopen($file, 'r');

            $line = ( fgets ($openfile, 128) );

            if ( $openfile )
               {
                 while( !feof ($openfile) )
               {
                  $line = ( fgets ($openfile, 128) );
                         echo $line .'<br>';

            } # End of while

            fclose($openfile);
               }

            regds
            Mike

            1. OK. So schnell geben wir nicht auf.

              :)

              Kannst Du die Datei lesen?

              Ja. Geht wunderbar.

              MfG

              1. Moin

                Kannst Du die Datei lesen?
                Ja. Geht wunderbar.

                Dann bleibt ein Dateirechte Konflikt

                Wo liegt die Datei? Windows , Linux, Unix?

                Wie sind die Rechte?

                regds
                Mike

        2. hi,

          Mal abgesehen davon, das deine Fehler Nachfolgefehler sind:
          ist der richtige Syntax von fopen
          fputs($handle, $data, strlen($data));

          die syntax von fopen ist also nur richtig, wenn man fopen als fputs schreibt ...?
          *wunder*

          gruss,
          wahsaga

    2. habe d'ehre

      Deine Versuche in Ehren, aber lies mal
      http://de.php.net/manual/de/language.operators.logical.php

      und betrachte die Anweisung
       $openfile = @fopen($file, "a+") || die("Die Datei konnte nicht gefunden werden!<br>");

      carpe diem
      Wilhelm

      1. Moin Wilhelm Turtschan

        habe d'ehre

        dto.

        Deine Versuche in Ehren, aber lies mal
        http://de.php.net/manual/de/language.operators.logical.php

        OK, habs. War aber eine Versuch Wert :-)

        regds
        Mike

  2. habe d'ehre

    if(!$openfile = fopen("$file","a+")):
     die("Open nicht erfolgreich<br>");
    else:
     $clan  = trim($clan);
     $home  = trim($home);
     $enemy = trim($enemy);
     $data = $clan."|-|".$home."|-|".$enemy."|-|\n";
     fputs($openfile, $data);
     fclose($openfile);
     echo "Das eingegebene War wurde gespeichert!<br>";
    endif;

    carpe diem
    Wilhelm

    1. Danke! Es klappt wunderbar. Hail to the King...;)
      Und noch einmal Danke an Magic Mike für deine Mühe!

    2. Moin Wilhelm Turtschan,

      if(!$openfile = fopen("$file","a+")):
       die("Open nicht erfolgreich<br>");

      endif;

      Ich ziehe mich auf mein Altenteil zurück. Wo war nu der Fehler?

      regds
      Mike

      1. Hello,

        Moin Wilhelm Turtschan,

        if(!$openfile = fopen("$file","a+")):
         die("Open nicht erfolgreich<br>");
        endif;

        Ich ziehe mich auf mein Altenteil zurück. Wo war nu der Fehler?

        Na, wenn du schreibst:

        $a = $b || $c;

        was steht dann hinterher in $a drin?

        Hier ein kleines "Testscript"
        ---------------------------------------------------------
        <?php ### reihenfolge.php , Abschnitt Operatoren ###

        $a = 1;
        $b = 4;
        $c = 7;

        $a = $b || $c;

        echo "a: $a<br>";
        echo "b: $b<br>";
        echo "c: $c<br>";

        echo "<hr>";

        $a = 0;
        $b = 0;
        $c = 1;

        $a = $b || $c;

        echo "a: $a<br>";
        echo "b: $b<br>";
        echo "c: $c<br>";

        echo "<hr>";

        $a = 0;
        $b = 7;

        $a = $b || die("keine Ausgabe");

        echo "a: $a<br>";
        echo "b: $b<br>";
        echo "c: $c<br>";

        echo "<hr>";

        $a = 1;
        $b = 4;
        $c = 7;

        ($a = $b) || $c;

        echo "a: $a<br>";
        echo "b: $b<br>";
        echo "c: $c<br>";

        ?>
        ------------------------------------------------------------

        Die Reihenfolger der Abarbeitung der Operatoren ist entscheidend.
        Der Vergleichsopertor || (OR) für der logischen Vergleich (also NICHT den bitweisen) wird für dem Zuweisungsoperator (=) ausgeführt. Wenn das Ergebnis des ODER also TRUE ist, dann wird dieses TRUE ( entspricht 1) dem $a zugewiesen. Es steht also hinterher nicht mehr das beschaffte Handle (hier symbolisch mit $b dargestellt) in $a, sondern das Ergebnis des ODER-Vergleichs.

        Wenn Du aber schreibst:

        if($a = $b) or ($c = $d);

        dann steht in $a danach auf jeden Fall $b drin und in in $c steht nur dann $d drin, wenn $b == 0 oder false war. (Zusatzinfo: Alle Werte waren vorher unterschiedlich)

        Wie man im kleinen Testprogramm sieht, würde auch

        ($a = $b) or $c;

        funktieren. Das ist aber kein sauberer Schreibstil, auch wenn das Statement in C-basierten Dialekten vollkommen in Ordnung ist.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hello,

          *was haben meine Finger da wieder für einen Schwachsinn getippt?*

          Die Abarbeitungsreihenfolge der Operatoren ist entscheidend.
          Der Vergleichsopertor || (OR) für den logischen Vergleich (also NICHT den bitweisen) wird vor dem Zuweisungsoperator (=) ausgeführt. Wenn das Ergebnis des ODER also TRUE ist, dann wird dieses TRUE ( entspricht 1) dem $a zugewiesen. Es steht also hinterher nicht mehr das beschaffte Handle (hier symbolisch mit $b dargestellt) in $a, sondern das Ergebnis des ODER-Vergleichs.

          Ich hoffe, so kann man es besser lesen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen