login  Naam:   Wachtwoord: 
Registreer je!
 Forum

header location error (Opgelost)

Offline Pietje - 19/10/2011 18:47 (laatste wijziging 19/10/2011 18:49)
Avatar van PietjeLid
  1. <?
  2. if(!$contact)
  3. {
  4. ?><form name="form1" method="post" action="contact.php?contact=send">
  5. <?
  6. if($_SESSION[usr_level]==1 or $_SESSION[usr_level]==2)
  7. {
  8. ?><input name="name" type="hidden" value="<? echo $_SESSION['usr_name']; ?>">
  9. <input name="from" type="hidden" value="<? echo $prof[email];?>" />
  10. <?
  11. }
  12. else
  13. {
  14. ?><input name="name" type="text" value="Mijn Naam" /><br />
  15. <input name="from" type="text" value="Mijn Email" /><br />
  16. <?
  17. }
  18. ?><input name="subject" type="text" value="Mijn Onderwerp" /><br />
  19. <textarea name="emailbody" rows="4">Mijn Bericht</textarea><br />
  20. <img src="security/captcha.php" /><br/>
  21. <input name="captcha" type="text" value="Anti Spam" /><br/>
  22. <input name="Submit" type="submit" value="Verstuur" />
  23. </form>
  24. <?
  25. }
  26. elseif($contact==send)
  27. {
  28. $from = $_POST['from'];
  29. $name = $_POST['name'];
  30. $emailbody = $_POST['emailbody'].'
  31. Stuur een bericht terug naar '.$name.' <'.$from.'>.';
  32. $subject = $name.' wilt het hebben over &#8220;'.$_POST['subject'].'&#8222;';
  33. $send = mail('support@voorbeeld.nl', $subject, $emailbody);
  34.  
  35. if(empty($_SESSION['captcha']) || strtolower(trim($_REQUEST['captcha'])) != $_SESSION['captcha'])
  36. {
  37. echo 'De anti spam code komt niet overeen.';
  38. header("Location: http://www.voorbeeld.nl/voorbeeld.php");
  39. }
  40. elseif($send)
  41. {
  42. header("Location: http://www.voorbeeld.nl/voorbeeld.php?contact=success");
  43. }
  44. }
  45. elseif($contact==success)
  46. {
  47. echo("Jouw bericht is verzonden!");
  48. }
  49. ?>

Is mijn script, en ik krijg deze error:

Warning: Cannot modify header information - headers already sent by (output started at /home/voorbeeld/domains/voorbeeld/public_html/voorbeeld.php:14) in /home/voorbeeld/domains/voorbeeld/public_html/voorbeeld.php on line 141

17 antwoorden

Gesponsorde links
Offline vinTage - 19/10/2011 18:59
Avatar van vinTage Nieuw lid Redirecten moet je doen voordat er output is verzonden naar de browser.

Offline Pietje - 19/10/2011 19:21
Avatar van Pietje Lid Het lukt niet... Kun jij misschien het script voor mij zo aanpassen? 
Offline WouterJ - 19/10/2011 19:32
Avatar van WouterJ HTML gevorderde Je mag de Header output niet voor een echo, spatie, html-code, ect. zetten. Voor meer uitleg en voorbeelden verwijs ik je naar deze tutorial: http://www.phph...y-sent/738/
Offline Wijnand - 20/10/2011 08:47
Avatar van Wijnand Moderator Bovenin je code (liefst in je hoofd-file als je die hebt) zetten:
<?php
ob_start();
Offline WouterJ - 20/10/2011 10:41
Avatar van WouterJ HTML gevorderde @Wijnand, dat is totaal geen goede oplossing. Dat is een verkeerde en onjuiste manier voor een oplossing. PHP code moet je gewoon altijd boven je doctype uitvoeren en daaronder alleen maar echoën, zo krijg je nooit problemen met een header location error.
Offline Maarten - 20/10/2011 10:43
Avatar van Maarten Erelid
Wijnand schreef:
Bovenin je code (liefst in je hoofd-file als je die hebt) zetten:
<?php
ob_start();

Onzin, dat is een slechte oplossing aangezien je het probleem niet aanpakt. Regel 37 en 38 omwisselen zal het probleem ook oplossen (ook al heeft regel 37 momenteel geen enkel nut) en is wel een goede oplossing.
Offline Wijnand - 20/10/2011 11:29
Avatar van Wijnand Moderator De vraag is: Wie bepaald wat een goede of en slechte oplossing is. Omdat er iemand heeft gezegd dat 'ob_start' geen goede oplossing is, is het daarom geen goede oplossing?

Laat ik zo zeggen. Ik gebruik ob_start() altijd en ik vind het geweldig werken :-).

Het is mijns inziens belachelijk om te zeggen van een oplossing die werkt dat het een slechte oplossing is.

Het heeft een beetje te maken met verschillende etiquette. Elke cultuur heeft z'n eigen etiquette, maar daarmee heb je nog niet het recht om te zeggen dat hoe iemand anders het doet, fout of 'de enige goede manier' is. Bv: Wij Nederlanders zeggen dat je niet moet boeren aan tafel. In China MOET je boeren aan tafel om aan te geven dat het lekker is. Wie zegt dat wat zij doen onbeschoft is? Wie zegt dat wat wij doen 'de enige goede manier' is? Dat zou belachelijk zijn om te zeggen.
Offline larssy1 - 20/10/2011 11:29
Avatar van larssy1 MySQL beginner of een iets minder slimme manier waarmee de kans bestaat dat een gebruiker niet word doorgestuurd.

Waar je normaal header("Location: Page"); hebt staan.. zet je nu
  1. <?php
  2. echo '<META HTTP-EQUIV="Refresh" Content="0; URL=Page">';
  3. ?>

Offline Maarten - 20/10/2011 11:41
Avatar van Maarten Erelid
Wijnand schreef:
De vraag is: Wie bepaald wat een goede of en slechte oplossing is. Omdat er iemand heeft gezegd dat 'ob_start' geen goede oplossing is, is het daarom geen goede oplossing?

Laat ik zo zeggen. Ik gebruik ob_start() altijd en ik vind het geweldig werken :-).

Het is mijns inziens belachelijk om te zeggen van een oplossing die werkt dat het een slechte oplossing is.

Het heeft een beetje te maken met verschillende etiquette. Elke cultuur heeft z'n eigen etiquette, maar daarmee heb je nog niet het recht om te zeggen dat hoe iemand anders het doet, fout of 'de enige goede manier' is. Bv: Wij Nederlanders zeggen dat je niet moet boeren aan tafel. In China MOET je boeren aan tafel om aan te geven dat het lekker is. Wie zegt dat wat zij doen onbeschoft is? Wie zegt dat wat wij doen 'de enige goede manier' is? Dat zou belachelijk zijn om te zeggen.

Mooie anekdote, maar het al dan niet goede oplossing zijn is geen kwestie van etiquette, het gaat over performantie en het niet begrijpen van het probleem in dit geval.
Citaat:
The general reason to avoid output buffering is that it buffers the
output. This seems stupidly obvious, but if your output is being saved
in a buffer until the end of the thing, then it's not being delivered
to the browser until the end of the process, all at once. Meaning that
your page doesn't appear to load gradually anymore, but the whole
thing has to run first, making it seem slower.

Now, if you're using it like you are, to capture only certain output
and prevent it from displaying, then ending the buffer, you don't have
this same problem. But output buffering in general is a poor solution.
You're basically taking something intended as output and putting it
into a string instead, so that you can presumably manipulate it. The
ideal solution in such a case is to rework something to give you the
string you want directly, not to work around it.

Om dan toch vergelijkingen te gaan maken: Het komt er op neer dat je vaststelt dat een kraan niet is dichtgedraaid, er 40 meter plakband over gaat plakken om het probleem op te lossen, omdat je niet doorhebt dat je de kraan gewoon kan dichtdraaien.
Offline Wijnand - 20/10/2011 13:45
Avatar van Wijnand Moderator :-)

Citaat:
Meaning that
your page doesn't appear to load gradually anymore, but the whole
thing has to run first, making it seem slower.

Dit bv is geen performance kwestie. Ik zelf wil niet dat mijn website 'stukje voor stukje' laad. Ik wil dat hij er 'opeens' staat. Overigens de website die ik zelf heb gemaakt in php, die laden gewoon snel. Er is geen zichtbare vertraging.

Citaat:
Om dan toch vergelijkingen te gaan maken: Het komt er op neer dat je vaststelt dat een kraan niet is dichtgedraaid, er 40 meter plakband over gaat plakken om het probleem op te lossen, omdat je niet doorhebt dat je de kraan gewoon kan dichtdraaien.

Dit is een beetje een rare vergelijking. Was beter geweest als je gezegd had om er gewoon een kurk in te doen. 40 meter plakband is wel veel moeite namelijk, maar 'ob_start()' is niet zo veel werk volgens mij :-).



Verder, moet ik je wel gelijk geven dat de andere manier 'netter' is, maar zoals ik al zei: ik gebruik altijd ob_start() en het werkt en is mijns inziens een goede oplossing voor zijn probleem.
Offline WouterJ - 20/10/2011 14:28
Avatar van WouterJ HTML gevorderde
larssy1 schreef:
of een iets minder slimme manier waarmee de kans bestaat dat een gebruiker niet word doorgestuurd.
Waar je normaal header("Location: Page"); hebt staan.. zet je nu
[..code..]

Ook dit is geen goede oplossing. Een meta tag hoort in de head, niet ergens halverwege in de body...

Wijnand schreef:
Verder, moet ik je wel gelijk geven dat de andere manier 'netter' is, maar zoals ik al zei: ik gebruik altijd ob_start() en het werkt en is mijns inziens een goede oplossing voor zijn probleem.

Het werkt, maar dat doen wel meer verkeerde methodes. Ik vind het net zo iets als de !important keyword in CSS. Het is wel een oplossing, maar niet de juiste.
Er zijn altijd meerdere wegen die naar Rome leiden. En in dit geval is de weg die er recht naar toe gaat de moeilijkste begaanbare weg, maar het is wel een hele mooie route en een makkelijke snelweg die om gaat en daarmee dwars door de mooie natuur gaat.
De snelweg is een goede oplossing, maar natuurlijk niet de beste. Het beste is om de onbegaanbare weg begaanbaarder te maken, zodat iedereen niet hoeft om te rijden en je de natuur niet aantast.

Zo werkt het met ob_start ook. Het is een oplossing en zal vast wel werken ook, maar het is niet de juiste oplossing als je kijkt naar de manier van werken. (zie ook mijn tutorial die ik in de eerste reactie had gezet)
Offline vinTage - 20/10/2011 17:46 (laatste wijziging 20/10/2011 17:47)
Avatar van vinTage Nieuw lid Zet ipv ob_start gewoon een functie bovenin.
  1. <?php
  2. function redirect($url)
  3. {
  4. header('location: '.$url);
  5. }
  6. ?>
  7. HTML meuk hiero


en roep redirect('....') gewoon aan ipv je header('location: ...)


Iest 'echo-en' voor een header location zie je toch niet, dus remove die meuk maar (tenzij je header refresh gebruikt, maar dit doe je niet dus...)
Offline WouterJ - 20/10/2011 22:48
Avatar van WouterJ HTML gevorderde @vinTage, dit werkt volgens mij ook niet? Want dan heb je nog steeds het header probleem, dat komt namelijk omdat er een header wordt verstuurd terwijl er al een andere header is verstuurd. Alsof je nog een passagier in een trein wilt stoppen, maar de trein is al vertrokken. Helaas je hebt je trein dan gemist, anders gezegd de Header is already sent. Headers worden verzonden bij het laden van de pagina.
Offline vinTage - 21/10/2011 01:34
Avatar van vinTage Nieuw lid Nuja, ik heb het niet tot in den treuren getest, maar in mijn paar testjes lukte allen zonder foutmeldingen.

offtopic, ob_start() ....wat een drama wordt er daar over gemaakt zeg, het enige wat dat doet is de output bufferen, mss (voor een K*T site) 1 mb in het buffer rammen? terwijl een fototje uploaden 4 keer meer kost ?

Ik geef toe dat zonder mooier is, maar gas geven voor oranje licht scheelt je ook een hoop tijd! (ok sloeg nergens op^^ )
Offline Pieter - 21/10/2011 08:25
Avatar van Pieter Gouden medaille

SEO guru
[Offtopic]

Wat een vergelijkingen trouwens, dit maakt het een wel erg grappig topic:

-Chinezen boeren uit cultuur
-Waterkraan dichtplakken met 40m tape
-Waterkraan dichten met kurk
-Snelweg dwars door de natuur omdat het mooier is
-Passagier in een trein stappen terwijl trein al weg is
-Gas geven voor oranje licht scheelt tijd

Benieuwd wat er nog volgt.
[/offtopic]
Offline Wijnand - 21/10/2011 08:45
Avatar van Wijnand Moderator @Pieter: Inderdaad erg grappig!

Maar goed, ik moet toch zeggen dat Maarten wel een punt heeft. ob_start() kan gewoon en werkt gewoon, maar Maarten's oplossing is wel beter/netter. Leuk dat hij ieder geval de tijd genomen heeft om uitgebreid te reageren :-).
Offline Pietje - 22/10/2011 12:08
Avatar van Pietje Lid Nah, het lukt gewoon niet . Ik sluit de topic.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.207s