Newsletter in Dateieintragen...

Darian

Erfahrenes Mitglied
Hallo Leute,

vorerst gleich einmal ich weiss dass es keine optimale Lösung ist, aber die wollen es so.

Ich schreibe gerade ein PHP Skript, das Mailadressen in eine Datei schreibt, oder die löscht wenn sie schon vorhanden sind.

Leider habe ich Probleme mit dem eintragen in die Datei. Ich möchte gerne in jeder Zeile eine Mailadresse haben. Und die alten in der Datei sollen überschrieben werden.

PHP:
if(isset($_REQUEST[submit])) {
					
					include("functions.inc.php");
					
					//Check Mailadresse
					if(preg_match("/[\.a-z0-9_-]+@[a-z0-9-]{2,}\.(([a-z]{2,6})|([a-z]{2,6}\.[a-z]{2,6}))$/i",$_REQUEST[email])) {
					
						$mails = file("mails.txt");
						$eintragen = 1;
						
						//Überprüfen ob die Mailadresse schon existiert
						//Wenn ja wird ausgetragen, wenn nein wird eingetragen
						foreach ($mails as $key => $mail) {
						
							if($mail == $_REQUEST[email]) {

								unset($mails[$key]);

								$eintragen = 0;
							}
						}
						
						//Nach löschen in der mitte bereinigen des Arrays
						if($eintragen = 0) {
							//Funktion die doppelte Einträge entfernt, und Lücken stopft...
                                                        $mails = CleanArray($mails);
						}
						else {
							array_push($mails, $_REQUEST[email]);
						}
						//Array wieder in Datei schreiben
						
						//$file = fopen("mails.txt", "w");
						
						//fwrite($file, $mails);
						
						unlink("mails.txt");
						
						file_put_contents("mails.txt", $mails);
						
						//Nachricht ausgabe
						if($eintragen == 0) {
							
							echo "Mailadresse erfolgreich ausgetragen!";
							//echo "<meta http-equiv='refresh' content='2;URL=newsletter.php'>";
						}
						else {
							
							echo "Mailadresse erfolgreich eingetragen!";
							//echo "<meta http-equiv='refresh' content='2;URL=newsletter.php'>";
							
						}
						
					}
					else {
							echo "Bitte geben Sie eine korrekte Mailadresse ein";
							echo "<meta http-equiv='refresh' content='2;URL=newsletter.php'>";
					}
					
				}
				else { ?>....HTML Code...

Wie könnte ich es den richtig machen, ich habe schon probiert die Datei vorher einfach zu löschen, aber irgendwie ändert das auch noch nichts.
Das Problem ist das alte Infos noch drinnen bleiben, oder er mehrere Mails in eine Zeile schreibt.

lg aus Guatemala, und danke für eventuell hilfreiche Antworten
Darian
 
Genau. Und ich find das bisschen umständlich hier:
PHP:
$mails = file("mails.txt");
                        $eintragen = 1;
                        
                        //Überprüfen ob die Mailadresse schon existiert
                        //Wenn ja wird ausgetragen, wenn nein wird eingetragen
                        foreach ($mails as $key => $mail) {
                        
                            if($mail == $_REQUEST[email]) {

                                unset($mails[$key]);

                                $eintragen = 0;
                            }
                        }

Wie wärs mit:
PHP:
$mails = file_get_contents("mails.txt");
$eintragen = (strpos($mails, $_REQUEST[email]) !== false) ;
if ($eingetragen) $mails = str_replace($_REQUEST[email] . "\n", "", $mails);
else $mails .= $_REQUEST[email] . "\n";

ui. jetz hab ich bisken übertrieben ^^ noch ein file_put_contents und die obigen zeilen machen das was du hier vor hast ;)
 
Hallo Leute,

stimmt, ich habe das mit dem String gelesen, aber irgendwie hat es den Array dann doch immer irgendwie eingetragen, und darum dachte ich dass es so schon auch funktioniert.

@ZodicXP: Ja ja, gefällt mir ganz gut wie du die Sachen so machst. Bin begeistert.

Hätte aber schon noch ein paar Sachen:

1. Das !== ist nicht nötig, weil es false, "" oder 0 oder so zurück gibt, und das von einem normalen if, auch als false gewertet wird (aus dem PHP Handbuch)
Warum machst du das dann so?

2. Aber leider funktioniert es trotzdem nicht, es trägt Mails die es austragen soll, trotzdem ein. (habe es auch mit !== probiert)

3. Sehr fein, an das mit dem \n hätte ich jetzt gar nicht mehr gedacht, war zu sehr Array und Schleifen fixiert.

lg aus Guatemala, und danke für die Infos, wirklich sehr interessant.
Darian
 
1. Das !== ist nicht nötig, weil es false, "" oder 0 oder so zurück gibt, und das von einem normalen if, auch als false gewertet wird (aus dem PHP Handbuch)
Warum machst du das dann so?

Wenn du das !== false weglässt und die E-Mail-Adresse ist an allererster Stelle in der Datei dann liefert strpos() dir eine 0, welche die if als false interpretiert und somit denkt es würde die Mail-Adresse nicht geben.

2. Aber leider funktioniert es trotzdem nicht, es trägt Mails die es austragen soll, trotzdem ein. (habe es auch mit !== probiert)

Kleiner Tippfehler bei den Variablennamen.
Und vielleicht schmeißt ihn das Case-Sensitive durcheinander. In dem Fall zunächst in der Datei alles klein schreiben, alles nur klein einfügen und nur klein vergleichen, oder preg_replace nehmen und den Modifier i anhängen.

Hier mit der Klein-Schreib-Lösung:
PHP:
$_REQUEST[email] = strtolower($_REQUEST[email]);
$mails = file_get_contents("mails.txt");
$eingetragen = (strpos($mails, $_REQUEST[email]) !== false) ;
if ($eingetragen) $mails = str_replace($_REQUEST[email] . "\n", "", $mails);
else $mails .= $_REQUEST[email] . "\n";
 
Zuletzt bearbeitet:
Passt danke, alles verstanden und gespeichert.

Das mit dem strtolower() habe ich aus Sicherheitsgründen auch noch eingebaut.

Danke für die Infos, war sehr interessant.

lg aus Guatemala
Darian
 
Zurück