Warning: Cannot modify header information - headers already sent by

Status
Niet open voor verdere reacties.

HenkRog

Gebruiker
Lid geworden
9 dec 2008
Berichten
70
Hallo,

is er nog een andere manier om een pagina na enkele acties een andere pagina te laten openen dan via de header functie? Ik krijg namelijk de warning Warning: Cannot modify header information - headers already sent by... Ik heb gelezen dat de header functie helemaal bovenaan in de php moet staan. Ik kan dat echter niet want het is een zelfverwerkende form en bovenaan wordt een header weergegeven (logo enz). Nochtans heb ik die header die bovenaan staat al eens in commentaar gezet en dan lukt het nog niet dus ik ben niet zeker dat dat wel het probleem is.
Om dit probleem op te lossen kan men ook een parameter in de php.ini aanpassen naar het schijnt. Dat is voor mij echter niet mogelijk omdat de site gehost wordt op een server die ook door andere mensen gebruikt wordt en daarom wil men die parameter niet veranderen.

Wat kan ik doen?
 
Dat kun je doen met een meta refresh
HTML:
<meta http-equiv="refresh" content="0;url=http://blaat.com/" />
Als je je aan een (x)html standaard houdt moet het tussen <head></head> komen hoewel het vanaf elke willekeurige plaats zal werken.
 
Als je echt 100% zeker bent dat de header niet bovenaan kan, dan zou je ook nog output_buffering kunnen gebruiken.

Dan kun je wel gewoon je header blijven gebruiken:

PHP:
<?php
ob_start();

echo 'Kijk, hier echo ik al een hoop tekst';

header('Location: entochkomthiernogeenheader.php');

ob_end_flush();

?>

Dan moet ob_start() helemaal bovenaan staan en ob_end_flush() helemaal onderaan.
 
Nog een vraagje:

als ik bovenaan de pagina een mysql_connect doe, en onderaan de pagina een mysql_close, moet ik dan, als ik halfweg de pagina een redirect doe (via header of meta http-equiv="refresh") daar ook eerst een mysql_close doen?
 
mysql_close hoef je (bij het genereren van webpaginas) nooit te gebruiken, de verbinding met de mysql server wordt automatisch verbroken wanneer het script is doorlopen.
 
Weet je dat zeker? Ik kreeg laatst van een jongen waarvoor ik een script geschreven had, de opmerkingen dat hij zijn site niet meer kon bekijken omdat MySQL een foutmelding gaf dat er teveel connecties openstonden. Ik zou het voor de zekerheid dus wel altijd gebruiken.

Daarnaast weet ik niet zeker of het wel zo is dat code na de redirect niet meer uitgevoerd wordt... Aangezien je normaal een exit() na een redirect header zet, denk ik dat de rest gewoon wel uitgevoerd wordt.
 
met de meta refresh lukt het

ik wou alsnog eens proberen om toch de header te gebruiken maar het lukt me niet (zie code hieronder)

config.php bevat gewoon wat variabelen

De validate geeft geen fouten dus doet geen echo.

Wanneer ik een exit zet voor de header functie en ik bekijk de broncode zie ik een leeg bestand, nochtans krijg ik steeds dezelfde error

opendb
Code:
<?php
$connection = mysql_connect($dbhost, $dbuser, $dbpass);

if (!$connection){
	die ("Error connecting to database: " . mysql_error());
}

$db_select=mysql_select_db($dbname);

if (!$db_select){
	die ("Error selecting database: " . mysql_error());
}
?>

functions
Code:
<?php
function cleanstring($str) {
	$str = trim($str);
    
	if(get_magic_quotes_gpc()) {
		$str = stripslashes($str);
    }
    
	return mysql_real_escape_string($str);
}
?>



Code:
<?php
	//include "header.php";
	
	include "config.php";
	include "opendb.php";
	include "functions.php";
			
	function validate($firmaNaam, $firmaPostcode) {
		$error = 0;
		if($firmaNaam == "") {
			echo('<img alt="" src="images/error.gif" width="19" height="19" alt="error" /> Firmanaam is een verplicht veld. <br />');
			$error = 1;
		}
		if($firmaPostcode != "" AND !ctype_digit($firmaPostcode) AND $firmaPostcode != "NULL") {
			echo('<img alt="" src="images/error.gif" width="19" height="19" alt="error" /> Postcode mag alleen cijfers bevatten. <br />');
			$error = 1;
		}
		if($error == 1) {
			return 0;
		}
		else {
			return 1;
		}
	}
			
	if(isset($_POST["BtnFirma"])) {
				
		$firmaNaam = cleanstring($_POST["txtFirmaNaam"]);
		$firmaStraat = cleanstring($_POST["txtFirmaStraat"]);
		$firmaHuisNummer = cleanstring($_POST["txtFirmaHuisnummer"]);
		//$firmaPostcode = $_POST["txtFirmaPostcode"];
		if($_POST["txtFirmaPostcode"] == "") {
			$firmaPostcode = "NULL";
		}
		else {
			$firmaPostcode = $_POST["txtFirmaPostcode"];
		}
		$firmaGemeente = cleanstring($_POST["txtFirmaGemeente"]);
		$firmaTel = cleanstring($_POST["txtFirmaTel"]);
		$firmaFax = cleanstring($_POST["txtFirmaFax"]);
		$firmaBTW = cleanstring($_POST["txtFirmaBTW"]);
		$firmaBIV = cleanstring($_POST["txtFirmaBIV"]);
		$firmaEmail = cleanstring($_POST["txtFirmaEmail"]);
		$firmaWebsite = cleanstring($_POST["txtFirmaWebsite"]);
		$firmaLogo = cleanstring($_POST["txtFirmaLogo"]);
		
		if(validate($firmaNaam, $firmaPostcode)) {
			$update = "UPDATE FIRMA SET 
			FIsOmschr = '$firmaNaam', 
			FIsStraat = '$firmaStraat',
			FIsHuisnummer = '$firmaHuisNummer',
			FInPostcode = $firmaPostcode,
			FIsGemeente = '$firmaGemeente',
			FIsTel = '$firmaTel',
			FIsFax = '$firmaFax',
			FIsBTW = '$firmaBTW',
			FIsBIV = '$firmaBIV',
			FIsEmail = '$firmaEmail',
			FIsWebsite = '$firmaWebsite',
			FIsLogo = '$firmaLogo' 
			WHERE FInun = " . $_POST["txtFirmaUN"];
			
			
			
			$result = mysql_query($update);
			
			if($result) {
				/* Redirect browser */
				header("Location: firma_overview.php"); 
				//echo('<meta http-equiv="refresh" content="0;url=firma_overview.php" />');

				/* Make sure that code below does not get executed when we redirect. */
				//exit;
			}
			else {
				echo("Error on update: " . mysql_error());
			}	
			
		}		
	}
	else {
		include "header.php";
		$un = $_GET["un"];
			
		$select = mysql_query(
		"SELECT FInUN, FIsOmschr, FIsStraat, FIsHuisnummer, FInPostcode, FIsGemeente, FIsTel, FIsFax, FIsBTW, FIsBIV, FIsEmail,
		FIsWebsite, FIsLogo
		FROM FIRMA 
		WHERE FInUN=$un");
		
		$row = mysql_fetch_array($select);
		
	
		//############################################ FORM ###########################################################

		echo('<form method="post" action="firma.php">');

		echo('<input name="txtFirmaUN" id="txtFirmaUN" type="hidden" value="' . $row["FInUN"] . '" />');
		echo('<p>');
		echo('<label id="lblFirmaNaam" for="txtFirmaNaam">Naam</label>');
		echo('<input name="txtFirmaNaam" id="txtFirmaNaam" type="text" value="' . $row["FIsOmschr"] . '" tabindex="1" size="50" maxlength="100" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaStraat" for="txtFirmaStraat">Straat</label>');
		echo('<input name="txtFirmaStraat" id="txtFirmaStraat" type="text" value="' . $row["FIsStraat"] . '" tabindex="2" size="50" maxlength="100" />');
		echo('<label id="lblFirmaHuisnummer" for="txtFirmaHuisnummer">Nr</label>');
		echo('<input name="txtFirmaHuisnummer" id="txtFirmaHuisnummer" type="text" value="' . $row["FIsHuisnummer"] . '" tabindex="3" size="4" maxlength="20" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaPostcode" for="txtFirmaPostcode">Postcode</label>');
		echo('<input name="txtFirmaPostcode" id="txtFirmaPostcode" type="text" value="' . $row["FInPostcode"] . '" tabindex="4" size="8" maxlength="20" />');
		echo('<label id="lblFirmaGemeente" for="txtFirmaGemeente">Gemeente</label>');
		echo('<input name="txtFirmaGemeente" id="txtFirmaGemeente" type="text" value="' . $row["FIsGemeente"] . '" tabindex="5" size="40" maxlength="100" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaTel" for="txtFirmaTel">Tel</label>');
		echo('<input name="txtFirmaTel" id="txtFirmaTel" type="telephone" value="' . $row["FIsTel"] . '" tabindex="6" size="25" maxlength="50"/>');
		echo('<label id="lblFirmaFax" for="txtFirmaFax">Fax</label>');
		echo('<input name="txtFirmaFax" id="txtFirmaFax" type="telephone" value="' . $row["FIsFax"] . '" tabindex="7" size="25" maxlength="50" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaBTW" for="txtFirmaBTW">BTW</label>');
		echo('<input name="txtFirmaBTW" id="txtFirmaBTW" type="text" value="' . $row["FIsBTW"] . '" tabindex="8" size="20" maxlength="30" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaBIV" for="txtFirmaBIV">BIV</label>');
		echo('<input name="txtFirmaBIV" id="txtFirmaBIV" type="text" value="' . $row["FIsBIV"] . '" tabindex="9" size="20" maxlength="30" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaEmail" for="txtFirmaEmail">Email</label>');
		echo('<input name="txtFirmaEmail" id="txtFirmaEmail" type="email" value="' . $row["FIsEmail"] . '" tabindex="10" size="50" maxlength="100"/>');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaWebsite" for="txtFirmaWebsite">Website</label>');
		echo('<input name="txtFirmaWebsite" id="txtFirmaWebsite" type="url" value="' . $row["FIsWebsite"] . '" tabindex="11" size="50" maxlength="100" />');
		echo('</p>');
		echo('<p>');
		echo('<label id="lblFirmaLogo" for="txtFirmaLogo">Logo</label>');
		echo('<input name="txtFirmaLogo" id="txtFirmaLogo" type="text" value="' . $row["FIsLogo"] . '" tabindex="12" size="70" maxlength="250" />');
		echo('</p>');
		echo('<br />');
		echo('<p>');
		echo('<input name="BtnFirma" type="submit" value="Opslaan" tabindex="13"/>');
		echo('</p>');
		
		//########################################## END FORM #########################################################

	}
	
	//include "closedb.php";
	include "footer.php";
?>
 
De exit moet ná de header. Na een exit wordt er niets meer uitgevoerd, dus ook de header niet. Daarnaast zie ik niet wat hier al output zou moeten geven, als jij zegt dat de validate functie dat niet doet.
 
Dat weet ik wel, maar ik had de exit eens voor de header gezet om te zien of er iets ge-output werd. Ik kreeg een leeg bestand dus er werd niks ge-output zoals ik al verwachtte.

Maar waar zit dan het probleem?
 
Ook geen spatie of enter of iets dergelijks, whitespace?

Of een andere header die je al gestuurd hebt?
 
nee ik vind het niet

maar de meta http-equiv="refresh" werkt dus ik ga er niet meer verder achter zoeken
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan