Jetzt kommt gar nichts mehr?
Und das wundert dich? Du hast ja auch das Formular in dem if(isset($_POST['senden']))-Block und dazu kommt es ja nie mehr.
Jetzt kommt gar nichts mehr?
Und das wundert dich? Du hast ja auch das Formular in dem if(isset($_POST['senden']))-Block und dazu kommt es ja nie mehr.
Also jetzt versteh ich gar nichts mehr.. Zuerstmal wirklich danke das du/ihr euch überhaupt mit meinem Problemchen befasst. Aber die Felderauswertungen stehen ja zwischen den Feldern, also wenn der erste if Block alles umschliessen soll. Das geht ja gar nicht, dann müsste ich es ja komplett umbauen. Oder?
Heisst für mich als Fazit: Alles löschen und neu schreiben, puuuh..
Richtig oder falsch?
Naja, verkehrt wäre es nicht, die Struktur ist verbesserungsfähig. Stichwort EVA-Prinzip.
Du solltest erstmal nur den PHP-Teil abhandeln, bevor du irgendeine Ausgabe machst. Alles was du im PHP-Teil ausgeben möchtest speicherst du in Variablen ab die du dann später an der entsprechenden Stelle ausgibst.
Also Aufbau:
- Prüfen ob Formular abgeschickt wurde
-- Falls ja:
--- Eingaben ok? Mail versenden und Erfolgsmeldung
--- Eingaben nicht ok? Passende Fehlermeldung
- Ausgabe des Formulars und gegebenenfalls Erfolgs-/Fehlermedlung
So in ganz grob zur Struktur. Die Überprüfungen kannst du ja aus deinem Script übernehmen, du kannst das ganze aber eben klarer strukturieren, was bei eventueller Fehlersuche und -korrektur hilfreich ist, wie du jetzt merkst.
Wenn man bedenkt das ich das von hier nachgebaut habe nur auf mein Formular angewendet --> http://www.youtube.com/watch?v=GKRAiAk5WCU traurig, und sowas gibt Hochschulkurse und nennt sich Programmierer. Krass! Naja ich werde es nach dem Essen gleich mal versuchen. Betonung liegt auf sowas
Hab mal kurz reingeschaut. Was er da erzählt ist grundsätzlich schon richtig. Mir ging es darum eben die Ausgabe von der Verarbeitung zu trennen. Wenn das Formular abgesendet wurde prüfst du die Daten, gibst aber während der Prüfung noch nichts aus sondern legst die Meldungen die du ausgeben willst in Variablen ab.
Und erst wenn die Verarbeitung komplett fertig ist kommt deine Ausgabe. Und da kannst du dann die abgelegten Meldungen mit ausgeben. Das widerspricht, soweit ich es mir angeschaut habe, nicht dem von dir verlinkten Video.
In groben Zügen:
<?php
error_reporting(E_ALL);
ini_set("display_errors", true);
$fehler = false; // wird auf true gesetzt wenn Fehler
$name = $email = $nachricht = "";
$fehler_name = $fehler_email = $fehler_nachricht = "";
if(isset($_POST['senden']))
{
$name = strip_tags(trim($_POST['name']));
$email = strip_tags(trim($_POST['email']));
$nachricht = strip_tags(trim($_POST['nachricht']));
if(empty($name))
{
$fehler_name = 'leer';
$fehler = true;
}
if(empty($email))
{
$fehler_email = 'leer';
$fehler = true;
}
elseif(! filter_var($email, FILTER_VALIDATE_EMAIL))
{
$fehler_email = 'Ungültige Email!';
$fehler = true;
}
if(empty($nachricht))
{
$fehler_nachricht = 'leer';
$fehler = true;
}
if($fehler === false)
{
$empfaenger = 'emailadresse@mail.de'; // wurde entfernt
$betreff = 'Nachricht von Kontaktformular http://domain.de';
$mailkopf = 'From: ' .$email. "\r\n";
if (mail($empfaenger,$betreff,$nachricht,$mailkopf))
{
if($_POST['email_kopie'] == 'kopie')
{
$betreff = 'Ihre Nachricht an http://domain.de';
mail($email,$betreff,$nachricht,$mailkopf);
}
echo '<p>Ihre Nachricht wurde erfolgreich versandt!</p>';
}
else
{
echo '<p>Ein Fehler ist aufgetreten</p>';
}
}
}
echo "<form action='" . $_SERVER['SCRIPT_NAME'] . "' method='post' id='kontaktform'>
<p>Name*: $fehler_name<br /><input type='text' name='name' value='$name' /></p>
<p>Email*: $fehler_email<br /><input type='text' name='email' value='$email' /></p>
<p>Ihre Nachricht*: $fehler_nachricht<br /><textarea name='nachricht' rows='15' cols='32'>$nachricht</textarea></p>
<p id='mailkopie'><input type='checkbox' name='email_kopie' value='kopie' /> Möchten Sie eine Kopie dieser E-Mail erhalten?</p>
<p><input type='submit' name='senden' value='Absenden' id='sendebutton' /></p>
<p id='pflichtfelder'>*Pflichtfelder</p>
</form>";
?>
Alles anzeigen
So, aber jetzt nicht einfach kopieren und sagen "fetisch", bitte auch versuchen zu verstehen, was da steht und warum das so da steht.
Dankeschön, ich habe es jetzt noch etwas verändert un das preg_match wieder eingebaut. Jetzt kommen auch beide Mails an. Lieber Unbekannter, findest du es besser nicht zu verketten und alles in doppelten Anführungszeichen zu schreiben. Ich habe gelernt das verketten schneller sein soll. Natürlich bei kleinen Scripten die auf Seiten mit wenig Besuchern eingesetzt werden unrelevant. Dachte nur ich gewöhne es mir gleich mit verketten an, bei 100000 Besuchern hat man da ja einen kleinen Geschwindigkeitsvorteil, auch wenn ich soviele Besucher bestimmt nie haben werde;-)
http://isi.square7.ch/kontakt/
Veränderter Code, auch mit Kommentaren ob ich alles richtig verstanden habe
<!DOCTYPE html>
<html>
<head>
<title>Kontakt - Senden Sie uns eine Nachricht</title>
<meta charset="windows-1252">
<meta name="description" content="">
<meta name="keywords" content="">
<link href="design.css" type="text/css" rel="stylesheet">
<link href="bilder/favicon.ico" type="image/x-icon" rel="shortcut icon">
</head>
<body>
<?php
error_reporting(E_ALL); ini_set("display_errors", true);
$timestamp_fuer_wochentag = time();
$wochentage = array('Monday' => 'Montag,', 'Tuesday' => 'Dienstag,', 'Wednesday' => 'Mittwoch,', 'Thursday' => 'Donnerstag,', 'Friday' => 'Freitag,','Saturday' => 'Samstag', 'Sunday' => 'Sonntag,');
$tag = strtr(date("l",$timestamp_fuer_wochentag),$wochentage);
$fehler = false; // wird auf true gesetzt wenn Fehler
$name = $email = $nachricht = ''; // Variablen initialisieren, Kurzschreibweise..noch nie gesehen
$fehler_name = $fehler_email = $fehler_nachricht = ''; // Variablen initialisieren, Kurzschreibweise..noch nie gesehen
$gesendet = $nicht_gesendet = '';
if(isset($_POST['senden']))
{
// wenn senden gedrückt weise Inhalte Variablen zu
// entferne SGML Tags und Leerzeichen
$name = strip_tags(trim($_POST['name']));
$email = strip_tags(trim($_POST['email']));
$nachricht = strip_tags(trim($_POST['nachricht']));
if(empty($name)) // wenn Name leer
{
$fehler_name = 'leer';
$fehler = true;
}
if(!empty($name) && preg_match('#\d#', $name))
{
$fehler_name = 'Ungültig';
$fehler = true;
}
if(empty($email)) // wenn Email leer
{
$fehler_email = 'leer';
$fehler = true;
}
elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) // wenn keine gültige Mailadresse
{
$fehler_email = 'Ungültige Email!';
$fehler = true;
}
if(empty($nachricht)) // wenn Nachricht leer
{
$fehler_nachricht = 'leer';
$fehler = true;
}
if($fehler === false) // wenn kein Fehler dann..
{
$empfaenger = 'emailadresse@mail.de';
$betreff = 'Nachricht von Kontaktformular http://domain.de';
$mailkopf = 'From: ' .$email. "\r\n";
if (mail($empfaenger,$betreff,$nachricht,$mailkopf))
{
if($_POST['email_kopie'] == 'kopie')
{
$betreff = 'Ihre Nachricht an http://domain.de';
mail($email,$betreff,$nachricht,$mailkopf);
}
$gesendet = '<p>Ihre Nachricht wurde erfolgreich versandt!</p>';
}
else
{
$nicht_gesendet = '<p>Ein Fehler ist aufgetreten</p>';
}
}
}
echo '<form action="index.php" method="post" id="kontaktform">';
echo '<p id="datum">' . $tag . ' den ' . date('d.m.Y') . '</p>';
echo '<p>Name*:'.$fehler_name.'<br /><input type="text" name="name" value="'.$name.'" /></p>';
echo '<p>Email*:'.$fehler_email.'<br /><input type="text" name="email" value="'.$email.'" /></p>';
echo '<p>Ihre Nachricht*:'.$fehler_nachricht.'<br /><textarea name="nachricht" rows="15" cols="32">'.$nachricht.'</textarea></p>';
echo '<p id="mailkopie"><input type="checkbox" name="email_kopie" value="kopie" /> Möchten Sie eine Kopie dieser E-Mail erhalten?</p>';
echo '<p><input type="submit" name="senden" value="Absenden" id="sendebutton" /></p>';
echo '<p id="pflichtfelder">*Pflichtfelder</p>';
echo '<p>'.$gesendet.'</p>';
echo '<p>'.$nicht_gesendet.'</p>';
echo '</form>';
?>
</body>
</html>
Alles anzeigen
Am Nachmittag werde ich mich noch damit befassen, das die Felder nach absenden wieder leer sind. Denn möchte kein Captcha haben sondern nur ein bisschen verhindern das man nicht F5 drücken kann um die nachricht nochmal zu versenden und ich werde mir noch mal den PHPMailer ansehen , und eventuell einbauen...
Sieht so aus, als wenn du es verstanden hättest.
Mit leeren Feldern verhinderst du mit F5 kein erneutes Senden. Ohne Captcha könntest du zu einer anderen Seite weiterleiten, dann geht auch F5 nicht mehr.
Und ja, benutzte den PHPMailer, damit kommen die Mails auch überall an und verschwinden nicht in Spamordnern, weil der Mailheader eventuell nicht ausreicht.
das ist jetzt eine Frage keine Kritik an deinem Vorgehen:
ZitatMit leeren Feldern verhinderst du mit F5 kein erneutes Senden. Ohne Captcha könntest du zu einer anderen Seite weiterleiten, dann geht auch F5 nicht mehr.
Ich dachte wenn die Felder wieder leer sind dann muss man sie ja erneut ausfüllen und das erschert das Spammen ja auch, stimmt das so nicht. Frag nur weil ich es mir so vorstelle..
Werde mir dann mal den Link von SinNlos --> http://phpforum.de/forum/showthread.php?t=216932 zu gemüte führen. Vielen Vielen Dank;-);-)
Das erste was mir beim PHP Mailer auffält, Senden von E-Mails mit mehreren Empfängern(TO), Kopieempfängern(CC), Blindkopieempfängern(BCC) und Antwortemailadressen(REPLY-TO) soll das wirklich gehen. In meinem Buch über PHP Sicherheit steht, das sollte man unterbinden? Alternativ kann man auch prüfen ob die Mailadresse Newlines enthält..
Wenn ich mal bisschen gelesen habe kommen bestimmt noch ein zwei Fragen, bis später
Ja, das geht alles mit dem PHPMailer. Anhänge und embedded-Images sind auch kein Problem. Diese Klasse ist wirklich gut.
Und was das F5 angeht, probiere es aus. Es ist ein Unterschied, ob du auf "Senden" klickst oder die Seite einfach aktualisierst. Dir zeigt der Browser bei F5 auch schon an, ob er die Daten wirklich nochmal schicken soll.
ZitatUnd was das F5 angeht, probiere es aus. Es ist ein Unterschied, ob du auf "Senden" klickst oder die Seite einfach aktualisierst. Dir zeigt der Browser bei F5 auch schon an, ob er die Daten wirklich nochmal schicken soll.
Nee ich mein, nehmen wir an die Felder werden nach dem Absenden wieder leer, dann kann man doch per F5 nicht neu senden, weil dann wieder geprüft wird ob Inhalte da sind und ob korrekt. Einem Spammer wäre das bestimmt zu nervig. Ich frag nur, weil ich es mir von der Logik her so vorstelle:
Felder korrekt ausgefüllt --> Nachricht wird versandt --> Felder sind wieder leer --> Erneute Prüfung bei Klick auf Senden --> Wenn Felder leer oder falsche ANgaben dann meckern. Kann man dann wirklich die Nachricht mehrmals abschicken.
Probiere es doch einfach aus! Fülle alle Felder aus, klicke senden und danach F5. Beim erneutem Klick auf Senden wird wieder überprüft, aber eben nicht mit F5
Probiere es doch einfach aus! Fülle alle Felder aus, klicke senden und danach F5. Beim erneutem Klick auf Senden wird wieder überprüft, aber eben nicht mit F5
Jop du hast recht, es wird wieder versendet. Daher waren meine Überlegungen ja ob man die Feldinhalte nach senden aus den feldern entfernen kann. Aber wird wahrscheinlich nicht gehen sonst hättest es mir schon gesagt?!
Ist gibt einige Möglichkeiten, ein mehrfaches Senden zu verhindern google liefert mit
php mehrfaches absenden formular verhindern
4.000.000 Treffer, da solltest du was finden.
So: Es funktioniert zwar wenn das Formular gesendet wurde, aber es erscheinen wieder Noticen. Ich glaub da habe ich noch Lernbedarf vom Ablauf her;-), dachte eigentlich die Vars sind initialisiert
if(isset($_POST['senden']) && $fehler==false)
{
unset($name);
unset($email);
unset($nachricht);
}
<!DOCTYPE html>
<html>
<head>
<title>Kontakt - Senden Sie uns eine Nachricht</title>
<meta charset="windows-1252">
<meta name="description" content="">
<meta name="keywords" content="">
<link href="design.css" type="text/css" rel="stylesheet">
<link href="bilder/favicon.ico" type="image/x-icon" rel="shortcut icon">
</head>
<body>
<?php
error_reporting(E_ALL); ini_set("display_errors", true);
$timestamp_fuer_wochentag = time();
$wochentage = array('Monday' => 'Montag,', 'Tuesday' => 'Dienstag,', 'Wednesday' => 'Mittwoch,', 'Thursday' => 'Donnerstag,', 'Friday' => 'Freitag,','Saturday' => 'Samstag', 'Sunday' => 'Sonntag,');
$tag = strtr(date("l",$timestamp_fuer_wochentag),$wochentage);
$fehler = false; // wird auf true gesetzt wenn Fehler
$name = $email = $nachricht = ''; // Variablen initialisieren, Kurzschreibweise
$fehler_name = $fehler_email = $fehler_nachricht = ''; // Variablen initialisieren, Kurzschreibweise
$gesendet = $nicht_gesendet = '';
if(isset($_POST['senden']))
{
// wenn senden gedrückt weise Inhalte Variablen zu
// entferne SGML Tags und Leerzeichen
$name = strip_tags(trim($_POST['name']));
$email = strip_tags(trim($_POST['email']));
$nachricht = strip_tags(trim($_POST['nachricht']));
if(empty($name)) // wenn Name leer
{
$fehler_name = 'leer';
$fehler = true;
}
if(!empty($name) && preg_match('#\d#', $name))
{
$fehler_name = 'Ungültig';
$fehler = true;
}
if(empty($email)) // wenn Email leer
{
$fehler_email = 'leer';
$fehler = true;
}
elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) // wenn keine gültige Mailadresse
{
$fehler_email = 'Ungültig!';
$fehler = true;
}
if(empty($nachricht)) // wenn Nachricht leer
{
$fehler_nachricht = 'leer';
$fehler = true;
}
if($fehler === false) // wenn kein Fehler dann..
{
$empfaenger = 'emailadresse@mail.de';
$betreff = 'Nachricht von Kontaktformular http://domain.de';
$mailkopf = 'From: ' .$email. "\r\n";
if (mail($empfaenger,$betreff,$nachricht,$mailkopf))
{
if($_POST['email_kopie'] == 'kopie')
{
$betreff = 'Ihre Nachricht an http://domain.de';
mail($email,$betreff,$nachricht,$mailkopf);
}
$gesendet = '<p>Ihre Nachricht wurde erfolgreich versandt!</p>';
}
else
{
$nicht_gesendet = '<p>Ein Fehler ist aufgetreten</p>';
}
}
}
if(isset($_POST['senden']) && $fehler==false)
{
unset($name);
unset($email);
unset($nachricht);
}
echo '<form action="index.php" method="post" id="kontaktform">';
echo '<p id="datum">' . $tag . ' den ' . date('d.m.Y') . '</p>';
echo '<p>Name*:'.$fehler_name.'<br /><input type="text" name="name" value="'.$name.'" /></p>';
echo '<p>Email*:'.$fehler_email.'<br /><input type="text" name="email" value="'.$email.'" /></p>';
echo '<p>Ihre Nachricht*:'.$fehler_nachricht.'<br /><textarea name="nachricht" rows="15" cols="32">'.$nachricht.'</textarea></p>';
echo '<p id="mailkopie"><input type="checkbox" name="email_kopie" value="kopie" /> Möchten Sie eine Kopie dieser E-Mail erhalten?</p>';
echo '<p><input type="submit" name="senden" value="Absenden" id="sendebutton" /></p>';
echo '<p id="pflichtfelder">*Pflichtfelder</p>';
echo '<p>'.$gesendet.'</p>';
echo '<p>'.$nicht_gesendet.'</p>';
echo '</form>';
?>
</body>
</html>
Alles anzeigen
http://isi.square7.ch/kontakt/
Ich denke laut Meldungen das eben wieder gesamter Ablauf vor dem Ablauf abgearbeitet wird und deshalb die Namen der Felder email_kopie usw.. noch nicht gesetzt sein können. Tipp???
------------
Es scheint der richtige Ansatz zu sein, denn Wenn Nachricht versendet, werden Felder leer und bei F5 kommt keine neue nachricht da die Felder ja leer sind. Muss nur noch die meldungen wegbekommen. Ich kann natürlich am Anfang error_reporting(E_ALL); ini_set("display_errors", true); ausklammern aber dann werden die meldungen ja nur verborgen und sind nicht behoben
Magst du mir noch sagen warum es mit unset nicht funktionierte, war es nicht die richtige Funktion? Jetzt klappt es wird keine weitere Mail versandt! Aber eine Notice kommt noch, dann hab ichs. Glaub liegt eben daran das das Formular erst danach kommt, aber wenn ich den Teil erst danach hinpacke bleibt die meldung trotzdem. Daher vielleicht doch was anderes
Steht doch in der Doku:
unset() löscht die angegebene Variable.
D.h., die Variable existiert danach nicht mehr.
ahh die Variable aber nicht den Inhalt?! Achja steht auch bei PHP.net, habe dann weiter unten gelesen man soll $GLOBALS(name); verwenden aber dann erschienen die Noticen immer noch. Löscht also bei unset($name) nur Variable und bei $GLOBALS Variable und den Inhalt?
Ich bin ehrlich ohne deine Hinweise und Hilfestellungwen hätte ich es denke ich niemals hinbekommen dioese Logik halbwegs zu verstehen
Zur Notice-Meldung:
Checkboxen werden nur übertragen, wenn sie angeklickt worden sind. Deshalb kommt bei
die Meldung "undefined index"
Richtig ist
wobei der Vergleich $_POST['email_kopie'] == 'kopie' in dem Falle nicht unbedingt nötig ist, da es ja nur diese eine Checkbox gibt