Een fout waarmee ik al weken bezig ben!

Status
Niet open voor verdere reacties.

RonaldGJ

Gebruiker
Lid geworden
28 apr 2007
Berichten
419
Ik heb een inlog script en nu is hij aan het zeuren met de functie header().
Ik heb eens opgespoord waar het mis gaat en het gaat mis op een stuk waarvan ik niet snap dat het daar mis kàn gaan.

De fout is:
Headers already sent in /var/................/index.php on line 9

En die lijn is:
<span class="login">

Ik snap niet dat de fout hier aan kan liggen.

Iemand een idee?
Vast bedankt,

Gr. Ronald!:)
 
Dat is het punt waarop het fout gaat, niet waar de fout zelf zit. Je stuurt html naar de browser en daarna een header aanvraag. Maar dat kan niet in die volgorde, van daar de foutmelding. Je kan alleen header aanvragen sturen als je nog geen html naar de browser stuurt. Je moet dus waar je de header() functie gebruikt zorgen dat dat geberut voor je html naar de browser stuurt. Plaats anders je verdere code ook even.
 
PHP:
<html>
	<head>
		<link href="style.css" rel="stylesheet" type="text/css">
		<title>Ronald Groot Jebbink.nl | Home</title>
	</head>
<body>
<center>
	<div id="header">
		<span class="login">
<?php
session_start();
$mysql_user = "user"; // je mysql login naam
$mysql_pass = "pass"; // je mysql wachtwoord
$mysql_host = "localhost"; // de host van je mysql database (localhost is meestal wel oke)
$mysql_dbn = "dbname"; // de naam van je database

if (!@mysql_select_db($mysql_dbn, @mysql_connect($mysql_host, $mysql_user, $mysql_pass))) 
{ 
    //--- De verbinding is nu dus mislukt, geef hier een melding van
    echo "Er is een fout opgetreden, probeer het later opnieuw!";
    
    //--- Zorg ervoor dat het script stopt.
    exit(); 
}

	if(!isset($_SESSION['pml_userid'])){
		echo "Welkom Gast.";
	} else {
		$query = "SELECT * FROM login WHERE id = '".$_SESSION['pml_userid']."'";
		$sql = mysql_query($query);
		$item = mysql_fetch_array($sql);
		echo "Welkom ".$item['voornaam'].".";
	}
?>
		</span>
	</div>
	<div id="container">
		<div id="content">
			<table>
				<tr>
					<td class="nav" valign="top">
			<ul class="menu">
				<li><a href="index.php?page=home">Home</a></li>
				<li><a href="?page=info">Info</a></li>
				<li><a href="?page=tutorials">Tutorials</a></li>
				<li><a href="?page=downloads">Downloads</a></li>
				<li><a href="?page=gastenboek">Gastenboek</a></li>
				<li><a href="?page=forum">Forum</a></li>
			</ul>
				<span class="tekst">
					<?php
						require_once("phpmylogon2/phpmylogon.php");
						pml_login();
					?>
				</span>

					</td>
					<td class="inhoud" valign="top">
					<span class="inhoud2">
					hier staat dan tekst.					</span>
					</td>
				</tr>
			</table>
		</div>
		<div id="footer">
			<span class="footer">
				© Copyright Ronald Groot Jebbink, 2008 | Vollenhove | <a href="?page=contact">Contact</a>
			</span>
		</div>
	</div>
</center>
</body>
</html>

Nu zie je in het midden staan:
PHP:
				<span class="tekst">
					<?php
						require_once("phpmylogon2/phpmylogon.php");
						pml_login();
					?>
				</span>

Ik denk dat het daar fout gaat. In die phpmylogon.php zitten aantal functies, werken prima! Enige wat ik gebruik is pml_login();. Dat stuk zal ik er ook bij zetten.

PHP:
<?php
function pml_login($todo = "",$action = "") {
	ob_start();
	include("lang.php");
	include("pml_config.inc.php");
	if(!isset($_SESSION)) { exit($lang['sessionproblem']); }
	
	pml_connect();
	
	// Check if user is logged in
	if(!isset($_SESSION['pml_userid'])) {
		if(isset($_COOKIE['pml_userid_cookie'])) {
			// Check cookie data with data in database
			$sql = "SELECT id,username,password,cookie_pass,actcode,rank FROM `".$settings['db_table']."` WHERE id = '".$_COOKIE['pml_userid_cookie']."' LIMIT 1";
			$query = mysql_query($sql);
			if(mysql_num_rows($query) == 1) {
				// User exists
				$row = mysql_fetch_array($query);
				$id = htmlspecialchars($row['id']);
				$username = htmlspecialchars($row['username']);
				$password_db = htmlspecialchars($row['password']);
				$cookie_pass = htmlspecialchars($row['cookie_pass']);
				$actcode = htmlspecialchars($row['actcode']);
				$rank = htmlspecialchars($row['rank']);
				
				if($actcode == "") {
					// Useraccount is activated
					if($cookie_pass == $_COOKIE['pml_usercode_cookie']) {
						// Everything ok, create sessions
						$_SESSION['pml_userid'] = $id;
						$_SESSION['pml_userrank'] = $rank;
						$sql_updateonline = "UPDATE `".$settings['db_table']."` SET lastactive = NOW() AND lastlogin = NOW() WHERE id = '".$id."' LIMIT 1";
						mysql_query($sql_updateonline);
						header("Location: ".$_SERVER['REQUEST_URI']);
					}else{
						// Incorrect password
						setcookie("pml_userid_cookie", "", time() - 3600);
						setcookie("pml_usercode_cookie", "", time() - 3600);
						header("Location: ".$_SERVER['REQUEST_URI']);
					}
				}else{
					setcookie("pml_userid_cookie", "", time() - 3600);
					setcookie("pml_usercode_cookie", "", time() - 3600);
					header("Location: ".$_SERVER['REQUEST_URI']);
				}
			}else{
				// User doesn't exists
				setcookie("pml_userid_cookie", "", time() - 3600);
				setcookie("pml_usercode_cookie", "", time() - 3600);
				header("Location: ".$_SERVER['REQUEST_URI']);
			}
		
		}
			
		if(isset($_POST['submit'])) {
			if($_POST['username'] != "" AND $_POST['password'] != "") {
				// Check submitted data with data in database
				$sql = "SELECT id,username,password,cookie_pass,actcode,rank FROM `".$settings['db_table']."` WHERE username = '".$_POST['username']."' LIMIT 1";
				$query = mysql_query($sql);
				if(mysql_num_rows($query) == 1) {
					// User exists
					$row = mysql_fetch_array($query);
					$id = htmlspecialchars($row['id']);
					$username = htmlspecialchars($row['username']);
					$password_db = htmlspecialchars($row['password']);
					$cookie_pass = htmlspecialchars($row['cookie_pass']);
					$actcode = htmlspecialchars($row['actcode']);
					$rank = htmlspecialchars($row['rank']);
					
					if($actcode == "") {
						// Useraccount is activated
						if($password_db == sha1(md5($_POST['password']))) {
							// Everything ok, create sessions
							$_SESSION['pml_userid'] = $id;
							$_SESSION['pml_userrank'] = $rank;
							if(isset($_POST['cookie'])) {
								// Also create cookie
								setcookie("pml_userid_cookie", $id, time() + 365 * 86400);
								if($cookie_pass == "") {
									// Create cookie code
									mt_srand((double)microtime()*1000000);
									$pass = 1;
									while(strlen($pass) <= 10) {
										$i = chr(mt_rand(0,255));
										if(eregi("^[a-z0-9]$",$i)) {
											$pass = $pass.$i;
										}
									}
									$cookie_pass = md5($pass);
									$sql_cookiepass = "UPDATE `".$settings['db_table']."` SET cookie_pass = '".$cookie_pass."' WHERE id = ".$id." LIMIT 1";
									mysql_query($sql_cookiepass);
								}
								setcookie("pml_usercode_cookie", $cookie_pass, time() + 365 * 86400);
							}
							$sql_updateonline = "UPDATE `".$settings['db_table']."` SET lastactive = NOW(),lastlogin = NOW() WHERE id = '".$id."' LIMIT 1";
							mysql_query($sql_updateonline) or trigger_error(mysql_error());
							header("Location: ".$_SERVER['REQUEST_URI']);
						}else{
							// Incorrect password
							echo $lang['login-incorrect']."<br />";
						}
					}else{
						echo $lang['login-notactive']."<br />";
					}
				}else{
					// User doesn't exists
					echo $lang['login-incorrect']."<br />";
				}
				
				
			}else{
				echo $lang['login-forgotfield']."<br />";
			}
		}
		// Login form
		echo "\n";
		?>
		<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
			<?php echo $lang['login-username']; ?>
			<br>
			<input class="input" type="text" id="username" name="username" <?php if(isset($_POST['username'])) { echo 'value="'.$_POST['username'].'"'; } ?> />
			<br>
			<label for="cookie"><?php echo $lang['login-password']; ?></label>
			<br>
			<input class="input" type="password" id="password" name="password"/>
			<br>
			<input type="checkbox" id="cookie" name="cookie" value="true" <?php if(isset($_POST['cookie'])) { echo "checked"; } ?> />
			<?php echo $lang['login-cookie']; ?>
			<br>
			<input type="submit" name="submit" value="<?php echo $lang['login-submitbutton']; ?>" />
		</form>
<a href="?page=registreren">Registreren</a><br>
<a href="?page=wachtwoordvergeten">Wachtwoord vergeten?</a>
		<?php
		
	}else{
		// User is logged on, redirect to page $goto; if no $goto just view msg that user is logged in
		if($todo != "") {
			if($todo == "include") {
				include($action);
			}elseif($todo == "redirect") {
				header("Location: ".$action);
			}else{
				echo $lang['functionproblem'];
			}
		}else{
			echo $lang['login-already'];
		}
	}
	ob_end_flush();
}
?>

Het is een lange code, maar ik hoop echt dat iemand de fout kan vinden, want ik ben al zo lang bezig:confused:.

Hartelijk bedankt in iedergeval!

Gr. Ronald!:)
 
ik weet het niet zeker, maar
PHP:
    ob_start();

kan je toch niet na de headers oproepen? (dus, omdat je het als functie aanroept (of eigenlijk eerst include werkt tie niet)

Probeer het eens zonder ob start en flush.
 
Als ik ob_start() en ob_end_flush() weghaal blijft dezelfde fout voorkomen.

Werkt dus ook niet.:confused:

Gr. Ronald!:)
 
Je roept "session_start()" aan, maar daarvoor is er al HTML output geweest (de div in je body).

Zet de session_start dan ook hélemaal bovenaan je script :)
 
Heb ik gedaan, dan werkt het nog niet.:confused:
Nog steeds gezeur met die header is already sent.

Gr. Ronald!:)
 
Haal ob_start() en ob_end_flush() eens uit die functie en maak van het eerste script dat je laat zien dit:
PHP:
<?php
session_start(); 
ob_start();
?>
<html> 
    <head> 
        <link href="style.css" rel="stylesheet" type="text/css"> 
        <title>Ronald Groot Jebbink.nl | Home</title> 
    </head> 
<body> 
<center> 
    <div id="header"> 
        <span class="login"> 
<?php 

$mysql_user = "user"; // je mysql login naam 
$mysql_pass = "pass"; // je mysql wachtwoord 
$mysql_host = "localhost"; // de host van je mysql database (localhost is meestal wel oke) 
$mysql_dbn = "dbname"; // de naam van je database 

if (!@mysql_select_db($mysql_dbn, @mysql_connect($mysql_host, $mysql_user, $mysql_pass)))  
{  
    //--- De verbinding is nu dus mislukt, geef hier een melding van 
    echo "Er is een fout opgetreden, probeer het later opnieuw!"; 
     
    //--- Zorg ervoor dat het script stopt. 
    exit();  
} 

    if(!isset($_SESSION['pml_userid'])){ 
        echo "Welkom Gast."; 
    } else { 
        $query = "SELECT * FROM login WHERE id = '".$_SESSION['pml_userid']."'"; 
        $sql = mysql_query($query); 
        $item = mysql_fetch_array($sql); 
        echo "Welkom ".$item['voornaam']."."; 
    } 
?> 
        </span> 
    </div> 
    <div id="container"> 
        <div id="content"> 
            <table> 
                <tr> 
                    <td class="nav" valign="top"> 
            <ul class="menu"> 
                <li><a href="index.php?page=home">Home</a></li> 
                <li><a href="?page=info">Info</a></li> 
                <li><a href="?page=tutorials">Tutorials</a></li> 
                <li><a href="?page=downloads">Downloads</a></li> 
                <li><a href="?page=gastenboek">Gastenboek</a></li> 
                <li><a href="?page=forum">Forum</a></li> 
            </ul> 
                <span class="tekst"> 
                    <?php 
                        require_once("phpmylogon2/phpmylogon.php"); 
                        pml_login(); 
                    ?> 
                </span> 

                    </td> 
                    <td class="inhoud" valign="top"> 
                    <span class="inhoud2"> 
                    hier staat dan tekst.                    </span> 
                    </td> 
                </tr> 
            </table> 
        </div> 
        <div id="footer"> 
            <span class="footer"> 
                © Copyright Ronald Groot Jebbink, 2008 | Vollenhove | <a href="?page=contact">Contact</a> 
            </span> 
        </div> 
    </div> 
</center> 
</body> 
</html>
<?php
ob_end_flush();
?>

Toch is het beter om de code helemaal opnieuw in te delen, want de manier waarop je nu ob_start en ob_end_flush gebruikt is gewoon om je foutmelding te omzeilen... Je lost het probleem dus niet echt op:rolleyes:
 
Laatst bewerkt:
Serieus, jou ben ik eeuwig dankbaar:thumb:!

Hij doet het eindelijk. Echt hartelijk bedankt, dan is het probleem nu eindelijk opgelost!:D

Gr. Ronald!:)
 
Toch is het beter om de code helemaal opnieuw in te delen, want de manier waarop je nu ob_start en ob_end_flush gebruikt is gewoon om je foutmelding te omzeilen... Je lost het probleem dus niet echt op:rolleyes:
Echt hartelijk bedankt, dan is het probleem nu eindelijk opgelost!
Hmm... deze vond ik gewoon té grappig. Zoals Tha Devil al aangaf is het probleem helemaal niet opgelost, maar enkel omzeild. Ik raad je aan om, als je niet tegen een deadline aanloopt, de site inderdaad eens op je gemak te herstructureren.
Het gebruik van ob_... (ob staat voor output buffering) getuigt enkel van een slecht design...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan