Cannot modify header information
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abschicken
anfang
aufpassen
code
datei
fehlermeldung
formular
frohe weihnachten
header
info
inhalt
klient
kontakt
platzhalter
post
problem
test
text
weiterleiten
zeile
-
Hi,
ich habe ein Problem. Ich arbeite mich derzeit in php ein und bastel an einem simplen Kontaktformular. der Code sieht wie folgt aus:
<?php $mailTo = "info@provider.de"; $mailSubject = "Kontaktanfrage"; $mailFrom = $_POST['name']; $mailFrom .= " <"; $mailFrom .= $_POST['mail']; $mailFrom .= ">\n"; $mailFrom .= "Reply-To: "; $mailFrom .= $_POST['mail']; $mailFrom .= "\n"; $returnPage = 'www.website.de/kontakt-erfolgreich.php'; $returnErrorPage = 'www.websites.de/kontakt-fehler.php'; $mailText = ""; if ($_SERVER['REQUEST_METHOD'] === "POST") { foreach($_POST as $name => $value) { $mailText .= $name . ":\t " . $value . "\n"; } } if(get_magic_quotes_gpc()) { $text = stripslashes($text); } $mailSent = @mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom); if($mailSent == TRUE) { header("Location: " . $returnPage); } else { header("Location: " . $returnErrorPage); } exit(); ?>
Mein Problem - wenn ich es einbinde und testen möchte wird das Formular erst garnicht angezeigt und duruch folgende Warnung ersetzt:
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/test/provider.de/kontakt.php:49) in /www/htdocs/test/provider.de/kontakt.php on line 76
Besagte Zeile 76 ist "header $returnPage" Zeile.
Irgendwie hab ich über die Google Suche auch keine passende Lösung gefunden. Vermutlich habe ich sie einfach übersehen, da ich noch nicht so fit in php bin. Vielleicht weiss hier ja jemand bescheid?
Wenn ich die header codes rausnehme klappt alles, E-Mail kommt an samt Inhalt, nur fehlt eben die gewollte Response für den User.
Was mir hierbei allerdings noch auffällt - Ich bekomme in manchen fällen eine zweite Mail zugestellt, mit dem InhaltMISSING_MAILBOX@SYNTAX_ERROR
Was tue ich hiergegen?
Ich bedanke mich vorab schonmal vielmals :)
Gruß
Flo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallöle,
das Problem hatte ich auch schon öfter.
Der Grund deines Problems liegt darin, dass du PHP dazu aufforderst etwas zu senden,
nachdem du bereits etwas abgeschickt hast.
Du musst also schauen, ob bei dir im Programm davor etwas ausgegeben wird-->löschen.
Auch ein simples Leerzeichen kann zu Problemen führen-->Dein Code sollte am besten als erste Zeichen "<?php" haben.
Ansonsten frohe Weihnachten :) -
Moin, vielen Dank für deinen Hinweis. Ich nun mal alle Leerzeichen usw. vor dem <?php und dem folgenden Code rausgenommen. Anschließend alle Tabulatoren, dann alle freien Zeilen. Das Problem ist noch immer dassselbe.
Nun schickt das Script aber tatsächlich etwas ab, da es ein Kontaktformular ist sendet es eine Mail an mich mit den eingegebenen Inhalten. Über die Prüfung ob die Mail rausgeschickt wurde soll er dann ja auf die Seite weiterleiten, auf der steht, dass die Anfrage erfolgreich zugestellt wurde. Wie kriege ich das denn besser gelöst, denn erst muss er die Mail ja abschicken und kann anschließend erst prüfen und eben weiterleiten.
Dir und euch allen auch frohe Weihnachten :)
EDIT: Ich habe nun die zweite header function rausgenommen (errorpage) und die success header weiterleitung über die mail function gesetzt. Nun wird mir kein Fehler mehr angezeigt, allerdings werde ich auch nicht weitergeleitet obwohl eine Mail abgeschickt wurde.
Ansich muss es auch garkeine Überprüfung geben ob eine Mail abgeschickt wurde, der Browser checkt bereits (über html required) ob die Felder ausgefüllt wurden. Wie kann ich dies bewerkstelligen?
Beitrag zuletzt geändert: 23.12.2015 11:43:30 von gamegazer -
Die E-Mail vorher abschicken sollte kein Problem sein.
Das Problem ist, das header nuneinmal die gesendeten Header verändert. Die müssen vor allem anderen an den Klienten geschickt werden. D.h. Du darfst in PHP davor auch nichts per echo o.ä. ausgeben. In der Fehlermeldung steht ja sogar, in welcher Zeile bereits etwas ausgegeben wurde (kontakt.php:49), das kann sich jetzt natürlich geändert haben, nachdem Du Sachen entfernt hast.
Außerdem solltest Du beim Absendernamen etwas aufpassen. Der kann ja auch bereits Sonderzeichen enthalten, d.h. er sollte in Anführungszeichen stehen, wobei Du dann natürlich wieder aufpassen musst, dass er nicht daraus ausbricht, d.h. alles schön escapen. -
Tach,
also wenn ich Du wäre, würde ich das Problem nicht mit
lösen, sondern den Befehlheader();
nutzen, mit dem du die jeweilige Seite "einbinden" kannst.require();
Auch Dir und allen anderen Frohe Weihnachten -
Funktioniert natürlich auch, hat allerdings einen Nachteil:
wenn der Benutzer die Seite neulädt, fragt der Browser ob er denn die Formulardaten erneut absenden soll. Wenn der Nutzer da dann auf »Ja« klickt, wird die Mail gleich ein 2. mal versendet (außer man unterbindet das durch irgendwelche Tokens o.ä., das scheint hier aber nicht der Fall zu sein). Durch die Weiterleitung kann das nicht passieren. -
<?php $mailTo = "info@website.de"; $mailSubject = "Kontaktanfrage"; $mailFrom = $_POST['name']; $mailFrom .= " <"; $mailFrom .= $_POST['mail']; $mailFrom .= ">\n"; $mailFrom .= "Reply-To: "; $mailFrom .= $_POST['mail']; $mailFrom .= "\n"; $returnPage = 'www.website.de/kontakt-erfolgreich.php'; $mailText = ""; if ($_SERVER['REQUEST_METHOD'] === "POST") { foreach($_POST as $name => $value) { $mailText .= $name . ":\t " . $value . "\n"; } } if(get_magic_quotes_gpc()) { $text = stripslashes($text); } $mailSent = @mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom); if($mailSent == TRUE) { header("Location: " . $returnPage); } ?>
Dies ist mein aktueller Code und ich kann keinerlei Ausgaben vor dem header finden bzw für mich ausmachen. Habe ich etwas übersehen? -
Wenn das der komplette Code in der Datei wäre, dann würde wohl kaum eine Fehlermeldung in Zeile 76 herauskommen…
-
<!doctype html> <html lang="de"> <head> <title>Platzhalter</title> <!-- edit --> <meta charset="UTF-8"> <meta name="keywords" content="Banane, Tomate, Gurke"> <!-- edit --> <meta name="description" content="Obst & Gemüse"> <!-- edit --> <meta name="publisher" content="Orangen"> <!-- edit --> <link type="text/css" rel="stylesheet" href="structure.css"> <link type="text/css" rel="stylesheet" href="style.css"> <link type="image/x-icon" rel="icon" sizes="16x16" href="favicon.ico"> <!-- add --> </head> <body> <header> <a href="index.html" id="logo">Platzhalter<br>Platzhalter</a> <div id="quote"> <q>Platzhalter</q><br> <span>Platzhalter</span> </div> <div id="subscribe"> <span>Die neuesten Jobs per E-Mail<span>Jede Woche</span></span><p> <!-- edit? --> <form accept-charset="utf-8"> <input class="inputmail" type="email" value="" placeholder="@ Deine E-Mailadresse" maxlength="100" required> <input class="subscribebutton" type="submit" value="Anmelden"> </form> </div> </header> <aside> <section class="topline upper_aside_info"> <h3>Platzhalter</h3> <p>Platzhalter <br>Platzhalter <br>Platzhalter <br>Platzhalter <p><a href="mailto:info@link.de">info@link.de</a> </section> </aside> <main class="main contact"> <div class="main_title_box_green"> <h1>Kontakt</h1> </div> <section> Schreib uns eine E-Mail. Wir werden uns umgehend bei dir melden.<p> <?php $mailTo = "info@link.de"; $mailSubject = "Kontaktanfrage"; $mailFrom = $_POST['name']; $mailFrom .= " <"; $mailFrom .= $_POST['mail']; $mailFrom .= ">\n"; $mailFrom .= "Reply-To: "; $mailFrom .= $_POST['mail']; $mailFrom .= "\n"; $returnPage = 'www.link.de/kontakt-erfolgreich.php'; $mailText = ""; if ($_SERVER['REQUEST_METHOD'] === "POST") { foreach($_POST as $name => $value) { $mailText .= $name . ":\t " . $value . "\n"; } } if(get_magic_quotes_gpc()) { $text = stripslashes($text); } $mailSent = @mail($mailTo, $mailSubject, $mailText, "From: ".$mailFrom); if($mailSent == TRUE) { header("Location: " . $returnPage); } ?> <form method="post" action=""> <fieldset> <label for="name">Name*</label><br> <input id="name" name="name" type="text" required /><p> <label for="email">E-Mail*</label><br> <input id="email" name="mail" type="email" maxlength="100" required /><p> <label for="telephone">Telefon</label><br> <input id="telephone" name="tele" type="text" /> </fieldset> <fieldset> <label for="message">Nachricht*</label><br><textarea id="message" name="text" required></textarea><br> <span class="little_letters">mit * markierte Felder sind erforderlich</span> </fieldset> <p><input class="submitbutton" type="submit" value="Abschicken" /> </form> </section> </main> <footer> <nav> <a href="link.html">link</a> ∙ <a href="link.php">link</a> ∙ <a href="link.php">link</a> ∙ <a href="link.php">link</a> ∙ <a href="link.html">link</a><br> <a href="link.html">link</a> ∙ <a href="link.html">link</a> </nav> <p><small>© website, 2015</small> </footer> </body> </html>
Dies ist der gesamte Code ;)
EDIT: Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/website/website.de/kontakt.php:48) in /www/htdocs/website/website.de/kontakt.php on line 73
Zeile 73 ist:if($mailSent == TRUE) {
Beitrag zuletzt geändert: 23.12.2015 12:30:25 von gamegazer -
Na da wird doch die ganze Zeit was ausgegeben… Wie gesagt, bevor irgendetwas an den Klienten gesendet wird, müssen die Header gesendet sein - die enthalten ja nunmal Angaben über die danachfolgenden Daten. Wenn die gesendet sind, kannst Du sie natürlich auch nicht mehr ändern.
Pack das PHP ganz an den Anfang der Datei bzw. lass das HTML ganz weg - Du leitest doch sowieso gleich weiter. -
Aber ich brauche den html teil ja, da dies das kontaktformular abbildet. Ohne dieses würde der user ja garnicht erst etwas absenden können. Ich habe den php Code nun an den Anfang gestellt, allerdings leitet er mich nun direkt weiter auf die success seite auch ohne abschicken einer mail.
Derweil bekomme ich, jedes mal wenn die Seite (Kontaktseite mit dem php code) geladen wird eine Mail zugestellt, mit dem AbsenderMISSING_MAILBOX@SYNTAX_ERROR
und keinem Inhalt. -
Mir war nicht ganz klar, dass Du das ja direkt in die Kontaktseite selber eingebettet hast. Du kannst entweder den PHP Code in eine eigene Datei packen und dann im Formular auf die verweisen (action=“datei.php“) oder Du überprüfst anständig, ob die _POST Variablen überhaupt gesetzt sind (was Du eigentlich sowieso tun solltest)…
-
Okay, vielen Dank für den Hinweis. Nach den Feiertagen werde ich es mit der Ausgliederung vom php Code versuchen. Wenn ich diesen explizit in die <form action="php.php"> reinhaue, dürfte ja das ganze nur ausgelöst werden, sobald der submit button betätigt wird, korrekt? Oder wie verhält sich php dort?
-
Ja, so ist es. Auch wenn du es mit echo ausgibst, bleibt es ja doch reines HTML. Denke Bitte auch an das Attribut methode="post". So wird dein Formular etwas sicherer.
php.php sollte die Zieldatei sein.
Ist die Zieldatei die gleiche Datei, wo du dein HTML Formular hast, dann kannst du auch PHP_SELF nutzen.
Das hat dann den Vorteil, dass wenn du die Datei mal woanders hast, nicht jedesmal den Pfad anpassen musst, bzw. wenn du diese in eine andere Datei includiert hast, wie in eine index.php oder so.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage