Hallo,

In mijn script, om bepaalde user wijzigen te kunnen doorvoeren gebruik ik vaak de header(); functie.

Nu loop ik bijna aan het einde van het script tegen het volgende aan:

Warning: Cannot modify header information - headers already sent by (output started at /path/user_view.php:316) in /path/user_view.php on line 345

De code die hierbij hoort is:


				echo '<div id="other">';
				
				if(isset($_POST['other']))
				{										
					$ssh->exec('zarafa-admin -u "'.getUserDetails('Username').'" -a "'.$_POST['type'].'" -n "'.$_POST['status'].'"');
					
					header('Location: index.php?page=user_view&user='.getUserDetails('Username').'');
				}			
				
				echo '<form method="post">';
				echo '<table id="edit" class="user">';
				echo '<tr>';
				echo '<td>Type</td> <td><select name="type">'.(isset($_POST['type']) ? ($_POST['type'] == '0' ? '<option value="0" selected="selected">Gebruiker</option><option value="1">Administrator</option>' : '') : '<option value="0" '.(getUserDetails('Administrator') == 'no' ? 'selected="selected"' : '').'>Gebruiker</option>').(isset($_POST['type']) ? ($_POST['type'] == '1' ? '<option value="0">Gebruiker</option><option value="1" selected="selected">Administrator</option>' : '') : '<option value="1" '.(getUserDetails('Administrator') == 'yes' ? 'selected="selected"' : '').'>Administrator</option>').'</select></td>';
				echo '</tr>';	
				echo '<tr>';
				echo '<td>Status</td> <td><select name="status">'.(isset($_POST['status']) ? ($_POST['status'] == '0' ? '<option value="0" selected="selected">Actief</option><option value="1">Niet actief</option>' : '') : '<option value="0" '.(getUserDetails('Active') == 'yes' ? 'selected="selected"' : '').'>Actief</option>').(isset($_POST['status']) ? ($_POST['status'] == '1' ? '<option value="0">Actief</option><option value="1" selected="selected">Niet actief</option>' : '') : '<option value="1" '.(getUserDetails('Active') == 'no' ? 'selected="selected"' : '').'>Niet actief</option>').'</select></td>';
				echo '</tr>';	
				echo '<tr>';
				echo '<td></td> <td><input type="submit" name="other" value="Opslaan" /> <input type="submit" name="cancel" value="Annuleren" /></td>';
				echo '</tr>';
				echo '</table>';
				echo '</form>';
				echo '</div>';
				
				echo '<div id="groups">';
				echo '</div>';
				
				echo '<div id="sendas">';
				
				if(isset($_POST['sendas']))
				{			
					foreach($_POST as $key => $value)
					{
						if(strpos($key, 'user-') === 0)
						{
							$getValue = explode ('-', $value);
						
							if($getValue[0] == 1)
							{
								$ssh->exec('zarafa-admin -u "'.getUserDetails('Username').'" --add-sendas "'.$getValue[1].'"');
								
								header('Location: index.php?page=user_view&user='.getUserDetails('Username').'');
							}
							
							if($getValue[0] == 0)
							{
								$ssh->exec('zarafa-admin -u "'.getUserDetails('Username').'" --del-sendas "'.$getValue[1].'"');
								
								header('Location: index.php?page=user_view&user='.getUserDetails('Username').'');
							}
						}
					}
				}
								
				echo '<form method="post">';			
				echo '<table>';
				echo '<tr>';
				echo '<th></th>';
				echo '<th>Ja</th>';
				echo '<th>Nee</th>';
				echo '</tr>';
				
				$getUsername = getUsers('0x6701001E');
				$getType = getUsers('0x67B10003');
				$getSendAsUsers = getSendAsUsers();

				$i = 0;
				
				foreach($getUsername as $key => $value)
				{
					$i++;
				
					echo '<tr>';
					
					if($getUsername[$key] != getUserDetails('Username'))
					{
						if($getType[$key] < 2)
						{
							echo '<td>'.$getUsername[$key].'</td>';
							echo '<td><input type="radio" name="user-'.$i.'" value="1-'.$getUsername[$key].'" '.(in_array($getUsername[$key], $getSendAsUsers) ? 'checked' : '').' /></td>';
							echo '<td><input type="radio" name="user-'.$i.'" value="0-'.$getUsername[$key].'" '.(!in_array($getUsername[$key], $getSendAsUsers) ? 'checked' : '').' /></td>';	
						}
					}
					
					echo '</tr>';
				}

				echo '<tr>';
				echo '<td><input type="submit" name="sendas" value="Opslaan" /> <input type="submit" name="cancel" value="Annuleren" /></td>';
				echo '</tr>';
				echo '</table>';
				echo '</form>';
				echo '</div>';


Waarbij de dik gedrukte regel 13 regel 316 is in het script.

Eerder is het script heb ik ook al 4/5 stukken met de header functie en dat gaat gewoon goed, en heb daar niks geen errors.

Ook heb ik helemaal boven en onderaan de pagina's het volgende al, zonder enig resultaat:

ob_start();
ob_end_flush();

Wat doe ik fout?
Je mag niet eerst karakters echo'en en daarna header gebruiken.

Als je header wil gebruiken, moet je dat doen vóór de eerste echo.

Er is geen enkele goede reden te verzinnen waarom je eerst <div id="other"> naar de client stuurt; om daarna nog met header de pagina te verlaten
Omdat die als het ware mijn tabjes scheiden. Waarom werkt dit wel dan?


				echo '<div id="other">';
				
				if(isset($_POST['other']))
				{										
					$ssh->exec('zarafa-admin -u "'.getUserDetails('Username').'" -a "'.$_POST['type'].'" -n "'.$_POST['status'].'"');
					
					header('Location: index.php?page=user_view&user='.getUserDetails('Username').'');
				}			
				
				echo '<form method="post">';
				echo '<table id="edit" class="user">';
				echo '<tr>';
				echo '<td>Type</td> <td><select name="type">'.(isset($_POST['type']) ? ($_POST['type'] == '0' ? '<option value="0" selected="selected">Gebruiker</option><option value="1">Administrator</option>' : '') : '<option value="0" '.(getUserDetails('Administrator') == 'no' ? 'selected="selected"' : '').'>Gebruiker</option>').(isset($_POST['type']) ? ($_POST['type'] == '1' ? '<option value="0">Gebruiker</option><option value="1" selected="selected">Administrator</option>' : '') : '<option value="1" '.(getUserDetails('Administrator') == 'yes' ? 'selected="selected"' : '').'>Administrator</option>').'</select></td>';
				echo '</tr>';	
				echo '<tr>';
				echo '<td>Status</td> <td><select name="status">'.(isset($_POST['status']) ? ($_POST['status'] == '0' ? '<option value="0" selected="selected">Actief</option><option value="1">Niet actief</option>' : '') : '<option value="0" '.(getUserDetails('Active') == 'yes' ? 'selected="selected"' : '').'>Actief</option>').(isset($_POST['status']) ? ($_POST['status'] == '1' ? '<option value="0">Actief</option><option value="1" selected="selected">Niet actief</option>' : '') : '<option value="1" '.(getUserDetails('Active') == 'no' ? 'selected="selected"' : '').'>Niet actief</option>').'</select></td>';
				echo '</tr>';	
				echo '<tr>';
				echo '<td></td> <td><input type="submit" name="other" value="Opslaan" /> <input type="submit" name="cancel" value="Annuleren" /></td>';
				echo '</tr>';
				echo '</table>';
				echo '</form>';
				echo '</div>';
mogelijk heb je op je server ingesteld staan dat een bepaald aantal bytes gebufferd wordt, zodat dat stukje '<div id="other">' nog even werd vastgehouden.

Nadeel daarvan is, dan je script prima werkt voor iemand met een korte naam die op een kort adres woont:

jo de bie
kerkstr 1

maar dan
jan-willem van hier-tot-ginder en terug
laan van meerdevoort 1542

ineens met een foutmelding geconfronteerd wordt, omdat je dan ineens wel de buffer geleegd hebt.
Hmm, oke! Wat zou hiervoor eventueel een oplossing kunnen zijn om toch de header te kunnen gebruiken?
De juiste manier is om eerst de headers te plaatsen en vervolgens pas de output (html, echo, print, etc)
Als je simpel regel 1 verplaatst naar regel 9, dan is het juist, maar in je script zitten nog meer headers die fout kunnen gaan. Of de headers of output verplaatsen of voor een minder mooie oplossing als meta refresh kiezen.
Gerben Kwakkel op 08/01/2014 10:25:11

Omdat die als het ware mijn tabjes scheiden.


Je moet dat anders zien.
Het eerste onderscheid dat je moet maken, is:
- PHP logica bovenaan in de code zetten
- HTML genereren / echo'en onderaan de code

Vooraleer je <!doctype html> op het scherm zet, moet je al weten of je header zal gebruiken; of niet.
Die logica kan je perfect helemaal bovenaan het script al uitwerken.
Alleen, hoe moet ik zoiets als dit nu toepassen boven de HTML?


				echo '<div id="delete">';
				
				if(isset($_POST['delete']))
				{
					$ssh->exec('zarafa-admin -d "'.getUserDetails('Username').'" && lat-users -d -f -c "'.getUserDetails('Username').'"');
			
					header('Location: index.php?page=user_summary');
				}
				else
				{	
					echo 'Weet u zeker dat u gebruiker <b>'.getUserDetails('Fullname').'</b> wilt verwijderen?<br /><br />';
					echo '<form method="post">';
					echo '<input type="submit" name="delete" value="Verwijderen" /> <input type="submit" name="cancel" value="Annuleren" />';
					echo '</form>';
				}
				
				echo '</div>';
regel 1 naar regel 11 verplaatsen...
Waarom kan je die if(isset($_POST['delete'])) niet bovenaan zetten?

if(isset($_POST['delete'])) is toch op geen enkele wijze afhankelijk van echo '<div id="delete">'; ?

Ik denk nog veel meer. Je begint een html pagina normaal gesproken niet met '<div>', daar zit nog een rits boven. Met andere woorden, gewoon alle php code waarin je een header wilt versturen gewoon boven de eerste output zetten (zoals Kris al meldde). Dat is toch niet zo moeilijk?

Reageren