Ik heb het volgende probleem:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/inventory/index.php:11) in /var/www/inventory/index.php on line 36

Dit komt doordat header niet als eerste verzonden word naar de browser heeft google me al geleerd.

ziehier de code:


<?
include('connect.php');
?>	
<html>
<head>
<link rel="stylesheet" type="text/css" href="basic.css">
</head>
<body>
<h1>Domains</h1>
	<h2>List of the domains</h2>
		<?
		$requete = "SELECT COUNT(DISTINCT zone) FROM dns_records";
		$res = mysql_query($requete);
		$ligne = mysql_fetch_array($res);
		echo '<p>There are ' .$ligne["COUNT(DISTINCT zone)"]. ' domains.</p>';
		?>
		<p>Add a new domain :</p>
		<form action="index.php" method="post">
		<input type="text" name="add_domain">
		<input type="submit" value="Add" name="add_domains" />
		</form>
		<?
		if ($_POST['add_domains'])
	{
		$add_domain=$_POST['add_domain'];
		$req = "SELECT COUNT(DISTINCT zone) FROM dns_records where zone like '$add_domain'";
		$res = mysql_query($req);
		$ligne = mysql_fetch_array($res);
		$zone=$ligne["COUNT(DISTINCT zone)"];
		if ($zone != 0) { echo "<p>This domain already exists!!!</p>"; } else
		{
		$requete = "INSERT INTO dns_records VALUES('0','$add_domain','@','86400','SOA','','ns1.webcommercedns.be.','peter.','2','28000','2800','64800','10'),
		('0','$add_domain','@','86400','NS','','ns1.webcommercedns.be.','','','','','',''),
		('0','$add_domain','@','86400','NS','','ns2.webcommercedns.be.','','','','','','')";
		mysql_query($requete) or die ('Erreur lors de l\'insertion');
		header('Location: domain.php?domain=$add_domain');
		};

...


Kan ik dit dan op een andere manier nog doen of zien jullie een oplossing?
Waarom begin je op regel 4 met <html> wanneer je weet dat je verderop in je code wellicht nog een header() wilt geven? Ga eerst de logica afhandelen en dan als allerlaatste nog even de boel op het scherm zetten. Mocht dat nodig zijn.

Ps. Een beetje foutafhandeling kan geen kwaad, bovenstaande code is namelijk nog láng niet af! De basis, de foutafhandeling, ontbreekt...
Je zou ipv [php]header[/php] gewoon een meta refresh kunnen gebruiken.


<?
header("Refresh: 2; url=idomain.php?domain=".$add_domain);
include('connect.php');
?>    
<html>
<head>
<link rel="stylesheet" type="text/css" href="basic.css">
</head>
<body>
<h1>Domains</h1>
    <h2>List of the domains</h2>
        <?
        $requete = "SELECT COUNT(DISTINCT zone) FROM dns_records";
        $res = mysql_query($requete);
        $ligne = mysql_fetch_array($res);
        echo '<p>There are ' .$ligne["COUNT(DISTINCT zone)"]. ' domains.</p>';
        ?>
        <p>Add a new domain :</p>
        <form action="index.php" method="post">
        <input type="text" name="add_domain">
        <input type="submit" value="Add" name="add_domains" />
        </form>
        <?
        if ($_POST['add_domains'])
    {
        $add_domain=$_POST['add_domain'];
        $req = "SELECT COUNT(DISTINCT zone) FROM dns_records where zone like '$add_domain'";
        $res = mysql_query($req);
        $ligne = mysql_fetch_array($res);
        $zone=$ligne["COUNT(DISTINCT zone)"];
        if ($zone != 0) { echo "<p>This domain already exists!!!</p>"; } else
        {
        $requete = "INSERT INTO dns_records VALUES('0','$add_domain','@','86400','SOA','','ns1.webcommercedns.be.','peter.','2','28000','2800','64800','10'),
        ('0','$add_domain','@','86400','NS','','ns1.webcommercedns.be.','','','','','',''),
        ('0','$add_domain','@','86400','NS','','ns2.webcommercedns.be.','','','','','','')";
        mysql_query($requete) or die ('Erreur lors de l\'insertion');

        };

... 
?>
Jazeker,

Verander de laatste regel:

 header('Location: domain.php?domain=$add_domain');


naar:

echo "<script type=\"text/javascript\">window.location='domain.php?domain=$add_domain'";</script>


EDIT: Of idd bovenstaande oplossingen.
Hallo Jarco,

Je zou eventueel ook de functies ob_start en ob_flush kunnen gebruiken. Wat eigenlijk gebeurd hierbij is dat de server de output vasthoudt totdat hij klaar is (of wanneer de ob_flush wordt aangeroepen). Pas dan stuurt hij de output terug naar de client (browser), de headers zijn dan niet verzonden :-)...

Patrick Niezen
Patrick Niezen schreef op 18.02.2008 13:45
Hallo Jarco,

Je zou eventueel ook de functies ob_start en ob_flush kunnen gebruiken.
ob is voor je vriendin, een PHP-script bloedt niet en heeft dus geen ob nodig.
Haha Frank,

ob_flush raakt je toilet zeker verstopt van? ;)
Ok het is gelukt met het javascriptje :)

de code is inderdaad nog niet af want het is een work in progress dus foutafhandeling enz zit er nog niet in.
Bedankt iedereen voor alle tips :D
Hahaha xD die houden wij er in

Zonder gekheid;
nu ik zo de andere oplossingen lees, ga ik die in de toekomst proberen. Ik heb eerder altijd ob_start() en ob_flush gebruikt... ik had dan meestal wel het gevoel dat het niet nodig was (en eigenlijk zonde was van het geheugen op de server).

Patrick Niezen
@Jarco

Die header refresh in mijn voorbeeld werkt in principe altijd, JavaScript kan je uitschakelen, daar heb je dus niets aan!

Reageren