Archief - Header already sent ...

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.

ruttennicky

Legacy Member
Hallo allemaal,

Ik heb een klein probleempje bij het programmeren van een PHP script. Heb ervaring met het programmeren in PHP, maar krijg dit niet opgelost.

De situatie :

- Index.php met een include naar een login.php (de pagina waarop het inlogscript staat)
- Login.php : scriptpagina met het script om te checken in de db of de user bestaat (duh ! :) ) en een setcookie.

index.php
PHP:
<body>
<?php
	include 'include/login.php';
?>
<div id="container">

	<div id="header_loginform">
    	<div class="spacer">
			<?php 
				login(); 
			?>
        </div>
    </div>
Dus zoals je ziet is login geincluded en login() verwijst naar de functie login() in login.php

login.php
PHP:
<?php
//Login script
//c 2009 Digitopie
		include 'verbinden.php';
	
		function login() {
			
			function loggedinAction() {
						$cookiestring = $_COOKIE['digitopie_cookie'];
						$parameters = explode("&",$cookiestring);
						echo("Welkom bij Digitopie, $naam $parameters[1] <br />Groep : $parameters[3] <br />Rol : $parameters[4]");
			}		
			
			function inlogAction() {
						if (isset($_POST['Inloggen'])) {
							ob_start();
							$gebruikersnaam = mysql_real_escape_string($_POST['txt_gebruikersnaam']);
							$paswoord = sha1($_POST['txt_paswoord']);
							if ($_POST['txt_gebruikersnaam'] != '' && $_POST['txt_paswoord'] != '') {
								$loginquery = "SELECT p.Id, p.Naam, p.Voornaam, r.RolNaam, g.GroepsNaam
											FROM (tblProfiel as p join tblRol as r on p.RolId = r.Id) join tblGroep as g on p.GroepId = g.Id
											WHERE p.Gebruikersnaam = '$gebruikersnaam' AND p.Paswoord = '$paswoord'";
								$loginqueryuitvoer = mysql_query($loginquery);
								while($loginresultaat = mysql_fetch_object($loginqueryuitvoer)) {
									/*
										$_SESSION['id'] = $loginresultaat->Id;
										$_SESSION['naam'] = $loginresultaat->Naam;
										$_SESSION['voornaam'] = $loginresultaat->Voornaam ;
										$_SESSION['groepsnaam'] = $loginresultaat->GroepsNaam;
										$_SESSION['rolnaam'] = $loginresultaat->RolNaam;*/
									$cookiecontent = $loginresultaat->Id . "&";
									$cookiecontent .= $loginresultaat->Naam . "&";
									$cookiecontent .= $loginresultaat->Voornaam . "&";
									$cookiecontent .= $loginresultaat->GroepsNaam . "&";
									$cookiecontent .= $loginresultaat->RolNaam;
									ob_end_clean();
									setcookie("digitopie_cookie",$cookiecontent,time()+3600);
									loggedinAction();
								}
							}
							else {
								$loginfail = true;
								echo("Gelieve een gebruikersnaam / paswoord in te geven");
							}
						
						}//end if
			}
			
			function showformAction() {
?>
			<form method="post">
                <ul id="menu">
                    <li><input type="text" name="txt_gebruikersnaam" value="Gebruikersnaam" /></li>
                    <li><input type="password" name="txt_paswoord" value="Paswoord" /></li>
                    <li><input type="submit" name="Inloggen" value="Inloggen" /></li>
                </ul>
            </form>
<?php
			}
						
			if (!isset($_COOKIE['digitopie_cookie'])) {
				showformAction();
				inlogAction();
			}
			else {
				loggedinAction();
			}
			
		}


Als ik run dan krijg ik deze fout :
Warning: Cannot modify header information - headers already sent by (output started at /home/digitopie/domains/digitopie.be/public_html/Digitopie/index.php:8) in /home/digitopie/domains/digitopie.be/public_html/Digitopie/include/login.php on line 37


Ik heb deze fout al vaker gehad en opgelost met ob_start(); maar nu weet ik niet waar ik dit moet zetten (heb al verschillende zaken geprobeerd).

Kan iemand mij helpen met dit stom iets ?


Groetjes,
Nicky

WMP

Legacy Member
Je roept

setcookie("digitopie_cookie",$cookiecontent,time()+3600);

aan terwijl de <body> tag al naar de browser is gestuurd. Dit zorg dus voor die error.

ruttennicky

Legacy Member
Ja, dus waar zet ik mijn ob_start of hoe kan ik dit anders oplossen ?

Curahee Q

Legacy Member
Niks te ob_start();

ob_start(); gaat inderdaad geen errors meer geven maar dat is absoluut niet proper werken. Zorg ervoor dat je php bovenaan je pagina komt (dus voor je output) en daarna pas je output.
Als je denkt dat het in jouw geval niet gaat is je opbouw verkeerd.

dJeez

Legacy Member
Wel nuttig om hier ook te vermelden aangezien ik er bijna een halve dag aan heb verloren : als je de headers already sent foutboodschap krijgt, ZONDER dat er een bestand wordt vermeld, en op lijnregel 0 (en je gebruikt nog PHP 5.2.5), dan kan je best upgraden naar de meest recente PHP versie.

Verder is het omzeilen van die foutboodschap door buffering te gebruiken inderdaad bad practice en dus af te raden. Je kan beter geen verkeerde gewoontes aanleren...
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