Sebastian G.: Liste durchsuchen

Hallo,

ich habe eine Liste von Namen, die in einem Textfile besteht.

Die Namen werden so reingeschrieben:

$text2 = "$name|\n";

$file2=fopen("list.txt","a");
fwrite($file2,$text2);
fclose($file2);

Und so ausgelesen:

$liste=file_get_contents("list.txt");

Danach splitte ich $liste so:

foreach($liste as $Zeile) {
  $GesplitteteZeile = explode("|", $Zeile);
  $NeueListe[] = trim($Zeile)."\n";
}

if (in_array($name,$NeueListe)) {
  echo "Sie sind bereits angemeldet."
}

Es kommt aber ein Fehler. Kann mir da jemand helfen?

Vielen dank!

  1. Hallo Sebastian,

    $text2 = "$name|\n";

    Steuerzeichen in einem Array zu speichern klingt nicht sonderlich sinnvoll, insbesondere, wenn du hier:

    $GesplitteteZeile = explode("|", $Zeile);
      $NeueListe[] = trim($Zeile)."\n";

    das Steuerzeichen entfernst und wieder anfuegst.

    Darueberhinaus ist das hier

    $liste=file_get_contents("list.txt");

    eine ungeeignete Methode, wenn du mit einem Array arbeiten willst, file() waere besser, weil es gleich ein Array zurueck gibt. Allerdings muss man das Resultat von file() auch wieder mit trim() bearbeiten, das es Zeilenumbrueche enthaelt, also etwa so:

    $liste = file("list.txt");
    foreach($liste as $key => $value) {
      $liste[$key] = $value;
    }

    und danach gleich:

    if (in_array($name, $liste)) {
       echo "Sie sind bereits angemeldet."
    }

    Klingt das nicht viel unkomplizierter?

    Es kommt aber ein Fehler. Kann mir da jemand helfen?

    Wenn Du eine Fehlermeldung erhaelst, poste diese bitte mit. Stelle zudem sicher, dass dein error_reporting immer auf E_ALL steht.

    Gruß,

    Dieter

    1. Oops

      $liste = file("list.txt");
      foreach($liste as $key => $value) {

      $liste[$key] = trim($value);
         sollte das naturlich heissen

      }

      Gruß,

      Dieter

  2. Hallo Sebastian.

    ich habe eine Liste von Namen, die in einem Textfile besteht.

    Die Namen werden so reingeschrieben:

    $text2 = "$name|\n";

    Wenn du sowieso alle Namen auf eine eigene Zeile schreibst, wozu dann die überflüssige Pipe?

    $file2=fopen("list.txt","a");
    fwrite($file2,$text2);
    fclose($file2);

    Nach Möglihkeit könntest du hier auch einfach file_put_contents nutzen.

    Und so ausgelesen:

    $liste=file_get_contents("list.txt");

    Möchtest du dich nicht vergewissern, dass diese Datei überhaupt gelesen werden konnte? Dazu gibt file_get_contents im Fehlerfall FALSE zurück, was du prüfen solltest.

    Danach splitte ich $liste so:

    Was teilweise entfallen könnte, wenn du einfach file verwendest.

    foreach($liste as $Zeile) {
      $GesplitteteZeile = explode("|", $Zeile);
      $NeueListe[] = trim($Zeile)."\n";
    }

    Du solltest $NeueListe vor dieser foreach-Schleife anlegen.

    if (in_array($name,$NeueListe)) {
      echo "Sie sind bereits angemeldet."
    }

    Schaue dir die echo-Zeile einmal genau an.

    Es kommt aber ein Fehler. Kann mir da jemand helfen?

    Ja: die Fehlermeldung. Und nebenbei solltest du auch error_reporting auf E_ALL stellen, damit dir auch Notices nicht entgehen.

    Einen schönen Sonntag noch.

    Gruß, Mathias

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

    vielen dank ihr beiden.

    Ich habe mal den Code von Dieter Raber eingesetzt.

    Jetzt kommt immerhin die Anzeige "Vielen Dank, dass sie sich..."

    Nein, Fehlermeldungen erhielt ich keine, obwohl error_reporting(E_ALL); gesetzt war.

    Eine Frage zum Skript, dass jetzt so aussieht:

    $text2 = "$name";

    $file2=fopen("list.txt","a");
    $liste = file("list.txt");
    foreach($liste as $key => $value) {
      $liste[$key] = $value;
    }
    fwrite($file2,$text2);
    fclose($file2);

    Dieses Skript produziert keine Fehler!

    Wenn ich aber

    if (in_array($name, $liste)) {
       echo "Sie sind bereits angemeldet."
    }

    anhänge, erhalte ich wieder nur eine Leere weiße Seite. Und wie kann ich eigentlich dafür sorgen, dass $text2 auch wirklich zeilenweisegeschrieben wird? Einfach sowas schreiben

    $text2 = "$name".\n;

    geht ja leider nicht.

    Danke schonmal für die Hilfe:)

    Sebastian

    1. Hallo Sebastian.

      Nein, Fehlermeldungen erhielt ich keine, obwohl error_reporting(E_ALL); gesetzt war.

      Leidest du unter gespaltener Persönlichkeit, oder wie erklärst du dir dann diese deine Worte:

      Es kommt aber ein Fehler.

      Eine Frage zum Skript, dass jetzt so aussieht:

      $text2 = "$name";

      $file2=fopen("list.txt","a");
      $liste = file("list.txt");
      foreach($liste as $key => $value) {
        $liste[$key] = $value;
      }
      fwrite($file2,$text2);
      fclose($file2);

      
      >   
      > Dieses Skript produziert keine Fehler!  
        
      Macht aber auch nichts Sinnvolles.  
        
      
      > Wenn ich aber  
      >   
      > if (in\_array($name, $liste)) {  
      >    echo "Sie sind bereits angemeldet."  
      > }  
      >   
      > anhänge, erhalte ich wieder nur eine Leere weiße Seite.  
        
      Nein, eine Fehlermeldung. Und deshalb noch einmal etwas deutlicher: schaue dir die echo-Zeile einmal GANZ genau an, insbesondere, was denn da am Ende dieser Zeile fehlen könnte, was der Fehler ist.  
        
      
      > Und wie kann ich eigentlich dafür sorgen, dass $text2 auch wirklich zeilenweisegeschrieben wird? Einfach sowas schreiben  
      >   
      > $text2 = "$name".\n;  
      >   
      > geht ja leider nicht.  
        
      Naja, nachdenken musst du schon. Zu anfang hattest du das Steuerzeichen für den Zeilenumbruch ja auch INNERHALB der Zeichenkette notiert und nicht danach …  
        
        
      Einen schönen Sonntag noch.  
        
      Gruß, Mathias  
      
      -- 
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
        
      debian/rules
      
    2. Hallo Sebastian,

      $text2 = "$name";

      Wozu dieses Umkopieren und selbst wenn es dafuer einen Grund gaebe, wozu die Anfuehrungsstriche? Und wo kommt dieses ominoese $name eigentlich her?
      Und was genau soll dein Skript eigentlich koennen? Ich stelle mir vor, es soll in einer Datei nachschauen ob da schon jemand eingetragen ist, und falls nicht, diesen Eintrag nachholen. Aber das ist reine Spekulation. Nehen wir mal an, es waere so, dann wuerde ich den Code folgendermassen aendern:

      $angemeldet = false;
      $file2=fopen("list.txt","a");
      $liste = file("list.txt");

      foreach($liste as $key => $value) {
          if(trim($value) == $name) {
            $angemeldet = true;
            break;
          }
      }
      if(!$angemeldet) {
         fwrite($file2, $name . "\n");
        $meldung = 'Vielen Dank...';
      }
      else
      {
        $meldung = 'Sie sind bereits angemeldet.';
      }
      fclose($file2);
      echo $meldung;

      Dieses Skript produziert keine Fehler!

      Jetzt vielleicht schon ;-), ich hab's nicht weiter getestet

      Gruß,

      Dieter

    3. Hallo,

      danke nochmal ihr beiden.

      Jetzt sieht das Script so aus:

      <?php

      error_reporting(E_ALL);

      $name = $_POST['name'];
      $kategorie = $_POST['kategorie'];
      $beschreibung = $_POST['beschreibung'];
      $script = nl2br(htmlentities($_POST['script']));

      //Ausgabe der internen Daten

      $text2 = $name."\n";

      $file2=fopen("list.txt","a");
      $liste = file("list.txt");
      foreach($liste as $key => $value) {
        $liste[$key] = $value;
      }
      fwrite($file2,$text2);
      fclose($file2);

      if (in_array($name, $liste)) {
         echo "Sie sind bereits angemeldet.";
         echo "<meta http-equiv='refresh' content='2; URL=index.php?action=seite1'>";
      }
      else {

      //Ausgabe der öffnetlichen Daten

      $text = <<<EOV

      <table width="100%">
        <tr>
          <td class="code1">
          <b>Name:</b> $name
          </td>
          <td class="code1">
          <b>Kategorie:</b> $kategorie
          </td>
        </tr>
        <tr>
          <td colspan="2" class="code2">
          <b>Skriptbeschreibung:</b> $beschreibung
          </td>
        </tr>
        <tr>
          <td class="code1" colspan="2">
          $script
          </td>
        </tr>
      </table><br/><br/>

      EOV;

      $file=fopen("$kategorie.php","a");
      fwrite($file,$text);
      fclose($file);

      echo <<< EOV

      <meta http-equiv="refresh" content="2; URL=index.php?action=seite1">
      Vielen Dank, dass sie sich eingetragen haben! Sie werden sofort weitergeleitet.

      EOV;

      }

      ?>

      Was es macht, dürfte nun eigentlich klar sein. Der Code soll eigentlich nur überprüfen, dass man sich nicht 2mal anmelden kann;-)

      Derzeit funktioniert es noch nicht ganz. Es kommt keine Fehlermeldung mehr (ja, ich hab ich jetzt verstanden, dass eine weiße Seite eine Fehlermeldung ist), aber man kann sich trotzdem mehrfach anmelden.

      Und ja, ich bin von alleine draufgekommen, wie man das \n hinzufügt!

      Ich bitte nochmal um Hilfe.

      Sebastian

      1. $name = $_POST['name'];
        $kategorie = $_POST['kategorie'];
        $beschreibung = $_POST['beschreibung'];

        Es hat keinen Sinn, den Wert einer Variable in einer anderen Variable zu speichern, sofern man nicht vor hat, den Wert im Script zu verändern.

        $script = nl2br(htmlentities($_POST['script']));

        Warum machst du das nicht auch mit '$beschreibung'?

        $text2 = $name."\n";

        Du solltest den Inhalt der Variable '$name' überprüfen - schliesslich kommt sie vom User, ist somit also nicht vertrauenswürdig.

        foreach($liste as $key => $value) {
          $liste[$key] = $value;
        }

        Diese Schleife hat gar keinen Sinn. Du gehst alle Schlüssel von '$liste' durch, nur um ihnen einen Wert zuzuweisen, den sie sowieso schon haben. Der Inhalt der Variablen '$liste' ist vor und nach der Schleife komplett identisch.

        fwrite($file2,$text2);
        fclose($file2);

        Dieser Codeschnippsel bewirkt, dass der Name ungeachtet dessen, ob er schon drinnen steht, in eine bestimmte Datei geschrieben wird. Was hat es für einen Sinn, dass ein Name mehrmals drin steht? Weiters ist es unnötig, die Variable '$text2' zu verwenden. Ihr Inhalt ist doch nur der Inhalt der Variable '$name' und ein Zeilenumbruch. Soviel ich weiß, kann man in der Parameterangabe einer Funktion auch Stringverknüpfungen verwenden.

        if (in_array($name, $liste)) {
           echo "Sie sind bereits angemeldet.";
           echo "<meta http-equiv='refresh' content='2; URL=index.php?action=seite1'>";
        }
        else {

        Der HTML-Code, der hier ausgegeben wird, ist vollkommener Schwachsinn. Eine Meta-Angabe darf nur im Header platziert werden, wobei der Text eine Zeile darüber nur im Body was zu suchen hat. Warum verwendest du zweimal echo? Du hast zwischen den zwei Ausgaben nicht mal einen Zeilenumbruch. Ich würde dir auch empfehlen, einen Link zu der Seite, zu der nach zwei Sekunden weitergeleitet wird, einzufügen. Außerdem solltest du den User darauf aufmerksam machen, dass eine Weiterleitung erfolgt.

        $text = <<<EOV

        <table width="100%">
          <tr>
            <td class="code1">
            <b>Name:</b> $name
            </td>
            <td class="code1">
            <b>Kategorie:</b> $kategorie
            </td>
          </tr>
          <tr>
            <td colspan="2" class="code2">
            <b>Skriptbeschreibung:</b> $beschreibung
            </td>
          </tr>
          <tr>
            <td class="code1" colspan="2">
            $script
            </td>
          </tr>
        </table><br/><br/>

        EOV;

        Hier verwendest du die Variablen '$name', '$kategorie', '$beschreibung' und '$script', die ja vom User kommen, ohne sie vorher zu prüfen. Der User könnte z.B. HTML-Tags verwenden und das Layout zerstören oder auch einen JS-Bereich einbauen, wodurch dann Werbung dargestellt wird. Merke: _Niemals_ Variablen, die vom User stammen, ungeprüft verwenden.

        $file=fopen("$kategorie.php","a");
        fwrite($file,$text);
        fclose($file);

        Hier verwendest du die Variable '$kategorie' ungeprüft. Was ist, wenn es eine Datei, die '$kategorie.php' heißt, nicht gibt? Oder noch schlimmer, es wird nicht eine Datei bearbeitet, die bearbeitet werden darf, sondern eine andere Datei, z.B. 'index.php'. Warum gibst du diesen Dateien überhaupt die Dateiendung 'php'? So wie ich das sehe, enthalten sie keinen PHP-Code.

        echo <<< EOV

        <meta http-equiv="refresh" content="2; URL=index.php?action=seite1">
        Vielen Dank, dass sie sich eingetragen haben! Sie werden sofort weitergeleitet.

        EOV;

        }

        Wieder die Sache mit der Meta-Angabe.

        Was es macht, dürfte nun eigentlich klar sein. Der Code soll eigentlich nur überprüfen, dass man sich nicht 2mal anmelden kann;-)

        Anmelden? Geht es bei diesem Code nicht darum, ein Script einzutragen?

        (ja, ich hab ich jetzt verstanden, dass eine weiße Seite eine Fehlermeldung ist)

        Eigentlich nicht. Sie heißt nur, dass du die Fehlermeldungen nicht anzeigen lässt, bzw. dass du gar nichts oder nur etwas, was der User auf dem ersten Blick nicht sieht, ausgibst.

        aber man kann sich trotzdem mehrfach anmelden.

        Stell dir mal vor, jemane gibt als Namen etwas ein, das mehrere Zeilenumbrüche enthält. Dann stehen für das Skript somit mehrere Namen anstatt von einem in der Datei. Somit ist das Mehrfach-"Anmelden" problemlos möglich. Wieso redest du überhaupt vom Anmelden? Wofür denn überhaupt? Man kann hier (soweit ich das verstanden habe) doch nur ein Skript eintragen. Das hat mit einem Anmelden doch gar nichts zu tun. Du willst wahrscheinlich verhindern, dass mehrere Skripte mit demselben Namen eingetragen werden.

        mfg
        Rato

        --
        §§§
        Meine Postings basieren lediglich auf mein Wissen und können völliger Blödsinn sein.
        §§§