Archief - PHP: Fameuze "cannot modify header information" error

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Wover

Legacy Member
Hoi,

ik ben sinds een paar dagen bezig aan mijn eerste site in php en ik ben uiteindelijk toch op een probleempje gestoten dat ik niet snap of kan oplossen.

De error die ik krijg:

Warning: Cannot modify header information - headers already sent by (output started at /home/users/w/wover/public_html/9Lives/inschrijven.php:6) in /home/users/w/wover/public_html/9Lives/inschrijven.php on line 33

Ik heb hem al gegoogled, maar ik snap nog steeds niet hoe ik het zou kunnen oplossen.

De code (niet de volledige pagina):

Code:
<?php
$datum_vandaag = date("Y-m-d");
$datum_einde = "2008-02-4";

	if($_POST["nickname"]!="" && $_POST["gsmnummer"]!="" && $_POST["select"]!="" && $_POST["select2"]!="" && $_POST["email"]!="" /*&& $_COOKIE["naam"]==""*/)
	{
		setcookie("naam",'$_POST[nickname]',time()+30);
		$con = mysql_connect("db.srv.sin.khk.be","xxxxx","xxxxx");
		if (!$con)
  		{
  			die('Could not connect: ' . mysql_error());
  		}

		mysql_select_db("wover", $con);

		$sql = "INSERT INTO 9L_inschrijvingen (nickname, naam, voornaam, leeftijd, gsm, auto, voorkeurkarting, voorkeuruur, email) VALUES ('$_POST[nickname]', '$_POST[achternaam]', '$_POST[voornaam]', '$_POST[leeftijd]', '$_POST[gsmnummer]', '$_POST[auto]', '$_POST[select]', '$_POST[select2]', '$_POST[email]')";
		
		if(!mysql_query($sql,$con))
  		{
  			die('Error: ' . mysql_error());
  		}

		mysql_close($con);		
	}
	else
	{
		if($_POST["submit"]=="Verzenden")
		{ echo "<p><b>U heeft niet alle verplichte velden ingevuld</b></p>"; }
	}

	if($datum_vandaag == $datum_einde)
	{
		echo "De inschrijvingen zijn gesloten.";
	}
	else
	{
		if($_COOKIE["naam"] != "")
		{
			echo "Welkom " . $_COOKIE["naam"];
		}
		else
		{
			echo "<b>U kan nog inschrijven tot zondag 3 februari 23:59u";
?>
<br /><br /><form id="inschrijvingsformulier" name="inschrijvingsformulier" method="post" action="">
...

De fout zit dus in de setcookie functie, zonder die functie werkt de site zonder problemen, maar ik heb hem toch echt nodig ;).

Alvast bedankt ;)

Wover

RpR

Legacy Member
Woverke zei:
Hoi,

ik ben sinds een paar dagen bezig aan mijn eerste site in php en ik ben uiteindelijk toch op een probleempje gestoten dat ik niet snap of kan oplossen.

De error die ik krijg:



Ik heb hem al gegoogled, maar ik snap nog steeds niet hoe ik het zou kunnen oplossen.

De code (niet de volledige pagina):

Code:
<?php
$datum_vandaag = date("Y-m-d");
$datum_einde = "2008-02-4";

	if($_POST["nickname"]!="" && $_POST["gsmnummer"]!="" && $_POST["select"]!="" && $_POST["select2"]!="" && $_POST["email"]!="" /*&& $_COOKIE["naam"]==""*/)
	{
		setcookie("naam",'$_POST[nickname]',time()+30);
		$con = mysql_connect("db.srv.sin.khk.be","xxxxx","xxxxx");
		if (!$con)
  		{
  			die('Could not connect: ' . mysql_error());
  		}

		mysql_select_db("wover", $con);

		$sql = "INSERT INTO 9L_inschrijvingen (nickname, naam, voornaam, leeftijd, gsm, auto, voorkeurkarting, voorkeuruur, email) VALUES ('$_POST[nickname]', '$_POST[achternaam]', '$_POST[voornaam]', '$_POST[leeftijd]', '$_POST[gsmnummer]', '$_POST[auto]', '$_POST[select]', '$_POST[select2]', '$_POST[email]')";
		
		if(!mysql_query($sql,$con))
  		{
  			die('Error: ' . mysql_error());
  		}

		mysql_close($con);		
	}
	else
	{
		if($_POST["submit"]=="Verzenden")
		{ echo "<p><b>U heeft niet alle verplichte velden ingevuld</b></p>"; }
	}

	if($datum_vandaag == $datum_einde)
	{
		echo "De inschrijvingen zijn gesloten.";
	}
	else
	{
		if($_COOKIE["naam"] != "")
		{
			echo "Welkom " . $_COOKIE["naam"];
		}
		else
		{
			echo "<b>U kan nog inschrijven tot zondag 3 februari 23:59u";
?>
<br /><br /><form id="inschrijvingsformulier" name="inschrijvingsformulier" method="post" action="">
...

De fout zit dus in de setcookie functie, zonder die functie werkt de site zonder problemen, maar ik heb hem toch echt nodig ;).

Alvast bedankt ;)

Wover
Waarschiijnlijk heb je voor je setcookie al html staan.
In Php kan je alleen maar een cookie zetten voor dat er iets van html is weggeschreven. Dus een echo voor de cookie zal deze fout ook weer geven.

Radiance

Legacy Member
Reden is zeer simpel, er mag geen enkel data output zijn in de code voor een functie die de headers aanpast, zoals setcookie();. Output is een php echo of gewoon HTML tussen uw php door. Zelfs een newline boven uw eerste php tag is al voldoende.

Work around :
Helemaal bovenaan de pagina
Code:
ob_start();
En dan als laatste
Code:
ob_end_flush();
Dit forceert PHP om alle output naar de browser te stoppen en enkel bij de flush iets te verzenden.

edit : zijt es ni zo rap seg :p

Wover

Legacy Member
Ok, bedankt.

Nu heb ik wel nog één klein probleempje:

Het betreft hier een inschrijvingsformulier, en vanaf dat iemand ingeschreven is moet er ipv dat inschrijvingsformulier de tekst "Welkom [naam]" komen, waarbij de naam opgeslagen is in een cookie (kwestie van db ruimte te sparen en aangezien er ook geen wachtwoorden nodig zijn etc...).

Maar na de inschrijving wordt de data gepost op dezelfde pagina, maar herkent hij de cookie blijkbaar nog niet, want het inschrijvingsformulier staat er nog altijd. Na naar een andere pagina te gaan en terug te keren klopt het wel...

Is hier een oplossing voor? Misschien een functie die de pagina herlaadt?

Smoerf

Legacy Member
kijk of er iets in uw $_POST['naam'] zit, if so druk da af (na controle)

En wrm database ruimte sparen?

Wover

Legacy Member
Smoerf zei:
kijk of er iets in uw $_POST['naam'] zit, if so druk da af (na controle)

En wat als de gebruiker een ongeldig formulier heeft gepost, dan zal er wel iets in de $_POST zitten, maar moet het formulier toch nog getoond worden.

Nog een extra variabele $error?

Wover

Legacy Member
Heb het al, gewoon een redirect naar dezelfde pagina doen, want een cookie kan pas aangesproken worden nadat de pagina een tweede keer geladen is. Beetje omslachtig to be honest, eerste indruk met php is minder positief dan met asp vind ik.

Smoerf

Legacy Member
als je een programmeertaal foutief gebruikt is het normaal dat het niet zo handig werkt me dunkt...

Uw methode is zoals van gent naar antwerpen rijden over amsterdam, niet echt de beste manier...

killgore

Legacy Member
Woverke zei:
Ok, bedankt.

Nu heb ik wel nog één klein probleempje:

Het betreft hier een inschrijvingsformulier, en vanaf dat iemand ingeschreven is moet er ipv dat inschrijvingsformulier de tekst "Welkom [naam]" komen, waarbij de naam opgeslagen is in een cookie (kwestie van db ruimte te sparen en aangezien er ook geen wachtwoorden nodig zijn etc...).

Maar na de inschrijving wordt de data gepost op dezelfde pagina, maar herkent hij de cookie blijkbaar nog niet, want het inschrijvingsformulier staat er nog altijd. Na naar een andere pagina te gaan en terug te keren klopt het wel...

Is hier een oplossing voor? Misschien een functie die de pagina herlaadt?

Je moet inderdaad herladen of de cookie-array handmatig invullen, dit heeft te maken met het http protocol en kan je niet omheen :).

killgore

Legacy Member
ter verduidelijking: met handmatig opvullen bedoel ik iets als:

bij elke setcookie("naam","waarde") ga je ook $_COOKIE["naam"]="waarde"; schrijven. Is ergens wel lomp, maar is wel enige manier. Je kan makkelijk hiervoor een eigen custom setcookie schrijven trouwens.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan