PHP-Übung

OkaminoChizu

Mitglied
Hallo,

ich beschäftige mich gerade mit dem PHP_Tutorial von http://www.php-kurs.com/. Aber jetzt bon ich bei der Übung Newsletteranmeldung http://www.php-kurs.com/uebung-newsletteranmeldung.htm. Bis zu Erstellung des Formulars und Versenden der Email hat alles geklappt, aber ab der Kontrolle funktioniert es nicht mehr. Das Lösungskript ist zwar vorhanden, ist aber anders, als meins, und ich finde den Fehler einfach nicht.

Newsletteranmeldung:
PHP:
<html>
<head> <title> Newsletteranmeldung </title></head>
<body>
<?php
//Formular
$kontrolle = date("syHdim");
if(empty($_GET['email']) == TRUE or empty($_GET['agb']) == TRUE) {
echo '<form action ="Newsletteranmeldung.php" method="get">
Ihre E-Mail-Adresse:<br>
<input type="text" name="email" value="'.$_GET['email'].'"><p>
Anrede: (optional)<br>
<input type="radio" name="anrede" value="Frau">Frau
<input type="radio" name="anrede" value="Herr">Herr<p>
Vorname: (optional)<br>
<input type="text" name="vorname" value="'.$_GET['vorname'].'"><p>
Nachname: (optional)<br>
<input type="text" name="nachname" value="'.$_GET['nachname'].'"><p>
<input type="checkbox" name="agb" value="agb">hiermit bin ich einverstanden, dass meine Daten elektronisch gespeichert<br> werden, damit mir die gewünschte Newsletter zugestellt werden kann ... <br>(gesetzliches Blahblah zum Datenschutz und Speicherung der Daten ....)<p>
<input type="hidden" name="kontrolle" value="'.$kontrolle.'">
<input type="submit" value="speichern">
</form>';}
//in Formular speichern
else {
$handle=fopen("newsletter.txt", "a+");
fwrite($handle, $_GET['email']);
fwrite($handle, " | ");
fwrite($handle, $_GET['anrede']);
fwrite($handle, " | ");
fwrite($handle, $_GET['vorname']);
fwrite($handle, " | ");
fwrite($handle, $_GET['nachname']);
fwrite($handle, " | ");
fwrite($handle, $_GET['kontrolle']);
fwrite($handle, "\r\n");
fclose($handle);
}
//Erstellung des E-mail textes, muss noch zur E-Mail werden (Server)
$betreff = "Newsletter-Anmeldung"; //Z 35
$absender = "resa.schiessl@web.de";
$antwortan = "resa.schiessl@web.de";
$anrede = $_GET['anrede'];
$vorname = $_GET['vorname'];
$nachname = $_GET['nachname'];//40
$email = $_GET['email'];
if ($_GET['anrede'] == "Frau") {             
$text = "Sehr geehrte $anrede";
}
else {
$text = "Sehr geehrter $anrede";
}
$text .= " $vorname $nachname,<p>Sie haben den Newsletter von ... bestellt. Um sicherzustellen, dass die E-Mail-Adresse <br>funktioniert und Sie den Newsletter erhalten möchten, klicken Sie bitte <br>auf folgenden Link:<p>http://localhost/newsletter-freischalten.php?mail=";
$text .= $email;
$text .= '&id=';
$text .= $kontrolle;
$text .="<p>Sollten Sie den Newsletter nicht angefordert haben, entschuldigen Sie bitte <br>diese E-Mail. Dann hat sich wahrscheinlich jemand vertippt. Ignorieren Sie <br>einfach die Mail und löschen Sie diese.";
echo $text;

?>
</body>
</html>

Bis hier hat wie gesagt alles geklappt, aber jetzt kommt die Freischaltung des Newsletters:

PHP:
<?php
echo "<pre>";
print_r ( $_GET );
$handle=fopen('newsletter.txt', 'r');
while($inhalt=fgets($handle, 4096)) {
$inhalt=trim($inhalt);
list($email, $anrede, $vorname, $nachname, $kontrolle) = explode("|", $inhalt);
echo $email;
echo $anrede;
echo $vorname;
echo $nachname;
echo $kontrolle;
echo "<br>";
if($email == $_GET['mail'] AND $kontrolle == $_GET['id'])
{
echo "Sie wurden freigeschaltet!";
speichern($email, $anrede, $vorname, $nachname, $kontrolle);
}
}

fclose($handle);
function speichern ($email, $anrede, $vorname, $nachname, $kontrolle)
{
$handle = fopen ( "nl-bestaetigt.txt", "a" );
fwrite ( $handle, $email );
fwrite ( $handle, "|" );
fwrite ( $handle, $anrede );
fwrite ( $handle, "|" );
fwrite ( $handle, $vorname );
fwrite ( $handle, "|" );
fwrite ( $handle, $nachname );
fwrite ( $handle, "|" );
fwrite ( $handle, $kontrolle );
fwrite ( $handle, "\r\n" );
fclose ( $handle );
}

?>

Ich würde mich sehr freuen, wenn mir jemand helfen könnte, es geht einfach nur um Übungszwecke.

LG,
Okami
 
Ist in der Datei newsletter.txt überhaupt was drin? Bist du dir im Klaren, das eine Text-Datei dafür evtl. etwas unglücklich gewählt ist, wenn mehrere Benutzer sich gleichzeitig anmelden, könnte es passieren, das ein Eintrag verloren geht. Das kannst du mit flock() entschärfen. Sollte in deinem Test vermutlich aber nicht das Problem darstellen.

Kontrollier erstmal, ob in newsletter.txt das gewünschte drin steht. Außerdem ist es gefährlich, direkt drauf los zu schreiben, ohne vorher das Handle zu prüfen. Das kannst du so erledigen:

PHP:
$handle = fopen("einedatei.txt", "a");
if(!$handle)
  die("Datei konnte nicht zum anhängen geöffnet werden.");
 
Danke erstmal für die schnelle Antwort. Ja, in der newsletter-Datei wird der Inhalt wie gewünscht gespeichert: e-mail | anrede | vorname | nachname | id.

if(!$handle)
die("Datei konnte nicht zum Anhängen geöffnet werden.");

habe ich jetzt eingefügt, aber wie muss ich flock() anwenden?

Das Problem ist nicht gelöst, aber ich glaube, dass der Fehler an dem Block

PHP:
if($email == $_GET['mail'] AND $kontrolle == $_GET['id'])
{
echo "Sie wurden freigeschaltet!";
speichern($email, $anrede, $vorname, $nachname, $kontrolle);
}

in der Datei newsletter-freischalten.php liegt. Denn wenn ich echo und speichern() aus der if-Bedingung rausnehme, würde es funktionieren. Allerdings weiß ich nicht, wie ich das Problem umgehen kann.

LG, Okami
 
Zurück