Newsletter-Anmeldung

  • Servus an alle,
    ich wollte für eine Seite ein PHP-Script schreiben, dass eine Newsletter-Anmeldung ermöglicht. Als Vorlage diente das Script vom PHP-Kurs, welches ich ein wenig veränderte.
    Das Mail erstellen und in bewerber.txt schreiben klappt schon ohne Probleme. Dabei hier mal ein paar Beispiele eines Eintrags in bewerber.txt


    In die Mail wird der Link folgendermaßen gestellt: ..../includes.php?mail=mail@example.com&id=7654321


    //Mail(Pflicht)|Vorname|Nachname|Geschlecht|Kennnummer|
    email@beispiel.de|Max|Mustermann|m|1234567|
    mail@example.com||Schuster||7654321|
    test@email.de|Martina||w|1234321|


    So werden die Einträge reingeschrieben, ohne Kommentarzeile. Diese sollen jetzt mit dem Script eingelesen und geprüft werden:

    Eigentlich sollte die Schleife doch eine Zeile nach der anderen auf die Variablen aufschlüsseln, bis die richtige Mail kommt. Wenn die erste Zeile die gesuchte ist, geht das auch, aber wenn man die mittlere anwählt, geht das Programm auf Dauerschleife und gibt
    Notice: Undefined offset: 4 in C:\xampp\htdocs\Website\includes\nl-activate.php on line 8
    solange aus, bis sich der Browser aufhängt.


    Was muss ich ändern???

  • Aber sobald er am Ende der Datei ist müsste die Schleife doch eigentlich aufhören, weil dann !feof() = false => Abbruch.
    Und damit er wegen $emai l!= $mail = true nicht weiter macht ist doch ein OR dazwischen.


    Damit die while-Schleife aufhört, reicht es bei OR schließlich, wenn eine Bedingung falsch ist.

  • OR:
    am anfang - beide "true" -> "while" läuft
    mail gefunden - zweite bed. "false", insg. wegen OR "false" -> "while" stoppt
    am ende der datei - erste. Bed. "false", insg. wegen OR "false" -> "while" stoppt


    Ich könnte genau so gut auch ein XOR einbauen, aber der Logikoperator ist nachgewiesenerweise richtig, denn die Schleife an sich erkennt zumindest bei einer Zeile korrekt, dass man die Mail hat. Der Fehler liegt eher bei der Variablen $line, aber ich weiß nicht genau wo!


    Also,
    - OR ist getesteter Weise der korrekte Operator, lassen wir also sinnlose Diskussionen
    - der Fehler liegt vermutlich bei $line
    - ist vermutlich das Auslesen der nächsten Zeile, dass er bei while nicht die nächste Zeile nimmt, sondern vom Ende der aktuellen ausgeht, das könnte auch den fehler auslösen, meiner Meinung nach.
    - Frage: Ist das richtig, und wenn ja, wie stelle ich sicher, dass das Script beim Auslesen in die nächste Zeile springt?

  • hilf mir bitte ich verstehe or nicht mehr:(
    (true or true) = true
    (true or false) = true
    (false or true) = true


    das ist doch so richtig und ist das bei dir jetzt anders?


    ansonsten echo doch einfach $mail aus da siehst du was er macht :)

  • Ich hab es mal mit && probiert.
    Link: /nl-activate.php?mail=email@beispiel.de&id=341203140011


    nl-candidates.txt

    Code
    email@example.com|Fritz||m|081202145911|
    mail@test.net|Max|Mustermann||021203140011|
    email@beispiel.de|||m|341203140011|


    nl-activate.php


    Ich habs jetzt nochmal mit logischem Und probiert. Heißt der Link ?mail=email@example.com&id=081202145911 geht es einwandfrei. Nehme ich obigen Link ist es zwar keine Endlosschleife mehr, allerdings kommt auch bei richtiger ID eine Fehlermeldung. ($mail habe ich nur leer gesetzt um diese blöde Notice loszuwerden).


    Meine Vermutung ist immer noch, dass der Code bei fgets(); mit dem Cursor nicht in die neue Zeile springt, woraufhin diese beim nächsten Durchgang eingelesen werden würde, sondern am Ende der aktuellen Zeile stehen bleibt, woraufhin diese Zeile vom Ende beginnend neu eingelesen werden würde.


    Also, über Logikoperatoren will ich nicht mehr diskutieren, die verwirren mich auch immer wieder :P, aber mein eigentliches Problem wurde trotzdem noch nicht gelöst ;(

  • ich sagte echo das aus^^
    mach doch einfach mal


    PHP
    $handle = fopen ("nl-candidates.txt", "r");
    
    
    
    
    while(!feof($handle)){
        $line = fgets($handle); 
        list($mail,$prename,$name,$gender,$checknum) = explode("|",$line);
        echo $mail;
    }


    und schau ob alle Daten raus kommen
    wenn ja dann echo einfach mal deine mail aus und schaue ob alles richtig
    echo $_GET['mail'];


    und so weiter, den fehler immer weiter eingrenzen...

  • Einfach mal durchge-echot:
    Der Link: /nl-activate.php?mail=email@beispiel.de&id=341203140011


    PHP
    while(!feof($handle)){
    	$line = fgets($handle);
    	list($mail,$prename,$name,$gender,$checknum) = explode("|",$line);
    	echo $email . ", " . $mail . "<br />";
    	echo $prename . "<br />";
    	echo $name . "<br />";
    	echo $gender . "<br />";
    	echo $id . ", " . $checknum . "<br />";
    }


    Das nl-candidates.txt:

    Code
    email@example.com|Fritz||m|081202145911|
    mail@test.net|Max|Mustermann||021203140011|
    email@beispiel.de|||m|341203140011|


    Die Ausgabe:

    Code
    email@beispiel.de, email@example.com
    Fritz
    
    
    
    
    m
    341203140011, 081202145911

    Und Ende. Er liest aus der Datei und dem Link also alles richtig aus und schreibt es in die korrekten Variablen, aber nur einmal. Das while sieht nach der ersten Zeile das Ende vom file??? ?(
    Vielleicht noch interessant dafür: Die Zeilenumbrüche in der nl-candidates.txt generiere ich mit \r\n

  • dann mach mal so wie es im php.net bei fgets steht. (fgets liefert doch schon von alleine falsch wenn er am ende ist)


    und zwar so hier:


    PHP
    while($line = fgets($handle)){
        list($mail,$prename,$name,$gender,$checknum) = explode("|",$line);
        echo $email . ", " . $mail . "<br />";
        echo $prename . "<br />";
        echo $name . "<br />";
        echo $gender . "<br />";
        echo $id . ", " . $checknum . "<br />";
    }
  • Ich habs gelöst! Das Problem war wirklich, dass das Zeilenende nicht richtig erkannt wurde.
    Gelöst durch die eine Zeile ini_set("auto_detect_line_endings", true); ganz am Anfang der nl-activate.php


    Jetzt noch eine andere Frage: Wie kann ich diese bestimmte, zuletzt eingelesene Zeile aus der .txt löschen?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!