Problem mit header("Location:danke.php");

  • Moin moin aus dem hohen Norden!


    Ich habe mir mit Hilfe zweier Videos ein Kontaktformular selber erstellt. Es funktioniert wunderbar, werden keine Daten eingeben erscheint eine Folgeseite mit der Aufforderung Daten einzugeben, sind alle Daten eingetragen, werden diese per eMail auch verschickt... ...ABER:


    Die Weiterleitung zu meiner danke.php-Seite wirft einen Fehler aus, den ich nicht verstehe. Alles im php-Script ist richtig geschrieben (wie im Video > da funktioniert es natürlich) UND meine Suche im Netz ergab, dass - wie im Video - der php-Code schon richtig ist:


    PHP
    1. header("Status: 301 Moved Permanently");
    2. header("Location:danke.php");


    Ich erhalte dann folgende Fehlermeldungen bezogen auf diese beiden Anweisungen:


    Warning: Cannot modify header information - headers already sent by (output started at /home/foto-finishde/public_html/lpk.rocks/sides/senden.php:2) in /home/foto-finishde/public_html/lpk.rocks/sides/senden.php on line 26
    Warning: Cannot modify header information - headers already sent by (output started at /home/foto-finishde/public_html/lpk.rocks/sides/senden.php:2) in /home/foto-finishde/public_html/lpk.rocks/sides/senden.php on line 27


    Auch habe ich die " " gegen ' ' getauscht... ...im Netz habe ich diese Seite gefunden: http://www.vlmedia.de/304/hauf…tion-headers-already-sent


    ...ich verstehe es und verstehe es doch nicht... 8|


    Hier noch mal mein gesamter Code:



    Könnt Ihr mir das ein wenig auseinander klabüstern?!? Bin wirklich für einleuchtende und korrigierende Hilfe sehr dankbar!!! Danke!!!

  • Danke für Deine Antwort Jav!


    Wie kommst Du auf Zeile 31? ...weil: Das ist eine Leerzeile. Meintest Du die?!?


    Egal wie. Ich bin - durch Versuch und Irrtum - einen Schritt weiter:


    "Die oben genannte Fehlermeldung wird vom PHP-Parser erzeugt, wenn versucht wird HTTP-Header-Daten zu senden, obwohl bereits Body-Daten gesendet wurden." (Zitat von der im Thread#1 verlinkten Seite).


    Ich habe daraufhin den "head"-Bereich kpl. VOR dem php-Script gesetzt. Jetzt ist die Fehlermeldung weg!


    Aber via header("Location:danke.php"); wird NICHT zur danke.php weitergeschaltet. Wenn ich jetzt wüsste warum, dann wäre das Problem gelöst.

  • Vorweg Jav: Ich bekomme nun eMails, wenn ein neuer Post in einem meiner Threads geschrieben wurde! Danke Dir nochmals > es war der eine kleine Haken!!!


    -----


    Ja! Das mit dem Löschen der Leerzeile habe ich gemacht. Änderte nix!


    Wie bereits geschrieben, ich habe jetzt den kpl. head-Bereich VOR das php-Script gesetzt > die Fehlermeldung ist weg.


    Aber ich bleibe auf meiner senden.php "hängen", es wird nicht wie von mir gewünscht zur danke.php weitergeleitet... ?(

  • Hallo!


    Die Fehlermeldung wird wahrscheinlich daran liegen, dass du die Header sehr spät sendest. Weiterleitung und Co. per header Veränderungen sind - soweit möglich - zu vermeiden. Du richtest bei größeren Projekten so Fehler an, die schwer zu debuggen sind (man denkt nicht daran).


    Hier ein guter Beitrag auf StackOverFlow.com.


    Zu deiner Frage:

    location sollte absolut sein, nicht relativ. Das heißt, mit http://meineseite.de/danke.php ersetzen :)


    Liebe Grüße

  • Ich würde es so lösen, dass die Datenverarbeitung bereits auf danke.php passiert, dann brauchst du keine Weiterleitung, alles chilli milli.


    ...ja das wäre in der Tat die beste Lösung. Ich habe mein Script aus einem Video-Lernkurs.


    ABER ERST MAL ALLES ZURÜCK: Die Fehlermeldung war die ganze Zeite doch noch da... ...ich bitte das zu entschuldigen: Sie war abgedeckt durch dunkle Bereiche in meinem Seitenaufbau.


    ogalb_nafets : Du meinst ich soll mir das Script in dem verlinkten Thread für meine Bedürfnisse modifizieren?

  • ABER ERST MAL ALLES ZURÜCK: Die Fehlermeldung war die ganze Zeite doch noch da... ...ich bitte das zu entschuldigen: Sie war abgedeckt durch dunkle Bereiche in meinem Seitenaufbau.


    Okay, ich hab mich schon gewundert. Durch die $_POST Variablen und Co. wurden schon Header Anweisungen geschickt - damit ist es für ein header Befehl zu spät! Deshalb wäre die beste Möglichkeit, auf danke.php das Formular abzuschicken.
    Apropos: ich würde es auswertung.php nennen. Dann kannst du gleich Fehlermeldungen und Co. anzeigen lassen :)


    Ich habe auf meine Antwort verwiesen, weil auch bei dir keine Mechanismen gegen Bots und Angriffen eingebaut sind (letzteres ist eh wurscht, da du keine Datenbank hast). Ich nehme an, dass du dann die E-Mails bekommst - so würdest du nur Spam bekommen (ich sprech aus Erfahrung :D ).


    Ich würde einen Honeypot und ein Captcha einbauen.
    Auch da kommst du dann nicht um eine externe PHP Datei herum.


    LG

  • Danke für die Antwort ogalb_nafets!


    Also der Einbau eines Captcha-Schutzes ist noch geplant!! ...das wäre das 3. Video :D ...aber dazu muss es ja erst mal primär laufen... :)


    Ich habe mit gerade noch mal das Script aus diesem anderen Thread angesehen: Damit bin ich überfordert!


    Soviel habe ich bis jetzt verstanden: Diese Fehlermeldung beruht wohl darauf, das body-Daten vor header-Daten gesendet werden. Natürlich funktioniert in den bereits erwähnten Videos alles... ...warum nicht bei mir. Auch auf UTF8 OHNE Bom habe ich geachtet... ...bin schon etwas ratlos.

  • Kein Problem Skogtroll :)


    Das Script solltest du eh nicht kopieren, da es sehr unsicher ist. Wollte dir nur meine Antwort verlinken, wo ich Tipps zum Umgang mit Formularen gegeben habe.
    Bei PHP und Co. "verschwendest" du ca. 60% deiner Zeit damit, Angriffe abzuwehren und es Angreifern/Bots schwerer zu machen.


    Der header Fehler ist schwer und kompliziert zu debuggen - deshalb sollte man darauf verzichten! Der header Befehl verändert die Ausgabe, was auch Sicherheitslücken mit sich bringt, deshalb wurde der Support für mehrere header-Befehle in PHP eingestellt.


    Wenn du eine Umleitung brauchst, würde ich Javascript verwenden. Da brauchst du einfach nur den Befehl als HTML zu "echoen". Bin mir aber ned sicher, ob es dann auch einen header Fehler mit sich zieht.


    http://www.websmith.de/blog/we…direct-mit-javascript-21/



    LG

  • Ah, jetzt, jaa! (ich muss so viel scrollen, da wird das etwas zäh mit dem durchsehen; bitte um Nachsicht.)


    HTML
    1. <form name="kontakt" action="senden.php" method="POST" enctype="text/html">


    Ich verstehe noch nicht das Problem: Kontakt ausfüllen (oder auch nicht) , auf den Senden-Button klicken, dann wird die danke-Seite aufgerufen - das muss dann natürlich auch in dem form-Tag stehen.


    HTML
    1. <form name="kontakt" action="danke.php" method="POST" enctype="text/html">


    Also das PHP aus dem obigen Script mit in die Danke-Seite, das sollte es doch eigentlich sein, wenn ich die Absicht richtig verstehe.

  • So Leute! Habe das Problem jetzt ganz anders gelöst!


    Aber zunächst: Lieben herzlichen Dank an Euch Alle für Euer Interesse und Eurer kompetenten Hilfe!


    Ich habe den Gedanken von ogalb_nafets aufgegriffen: Bleibe doch auf der selben Seite!


    Ich habe nun unter der if-Logik eine txt-Datei includet, die dem Besucher sagt: Alles O.K.! eMail versendet usw. usw.


    ...und unter else eine andere txt-Datei includet, die da sagt: Bitte alle Felder ausfüllen.


    Und das klappt wunderbar!!!!


    Jetzt habe ich aber eine andere Frage. Hätte ich weiterschalten können zu einer danke.php, dann wäre im head ein "<meta http-equiv="Refresh" content="5;URL=../index.php">" gewesen, der nach 5 Sekunden auf meine Startseite geschaltet hätte.


    Kann ich hinter meiner includet-Anweisung jetzt per php einen Timer setzen, der nach 5 Sekunden weiterleitet... ...wobei :rolleyes: ...ich überlege gerade: Dann könnte ja wieder dieser omminöse Fehler kommen... ...oder ?( ...


    Was meint Ihr?


  • Würde ich nicht benutzen, da du nicht weißt, wie lange das Skript braucht (wenn du später eventuell was hinzufügst ala. Danke, Skogtroll. Deine Daten:). Ich würde Javascript benutzen.




    Verstehe zwar nicht zu 100% den Zusammenhang, aber PHP kannst du mit der Funktion sleep() für eine bestimmte Anzahl von Sekunden schlafen legen.


    Du vergisst, dass das PHP ist. D.h. es pausiert die Skriptausführung auf dem Server.


    //EDIT: oder sehe ich das falsch?



    Liebe Grüße

  • Danke nochmals für Euer Interesse!


    ogalb_nafets : Hatte heute Nachmittag ein wenig Zeit über und habe mir mal Deinen Vorschlag mit dem "Honeypot" etwas näher angesehen. Der Name ist ja schon zuckersüß! ...und die Idee die dahinter steckt ist einfach nur charmant!


    Wenn man die Zusammenhänge ein wenig versteht, dann ist das schon eine tolle Sache. Ich werde mal versuchen, das auf mein Script zu übertragen.


    Danke Dir!

  • Bitte, kein Problem!


    Ich habe in dem Artikel allerdings einen "Fehler" gefunden. Falls der Honeypot ausgefüllt wird, wird bei dem Skript eine Fehlermeldung angezeigt. Ich würde das nicht machen, da intelligente Bots das erkennen. Einfach die selbe Meldung "E-Mail wurde gesendet!" anzeigen lassen :)


    Ja der Name ist schon putzig :)