webForumDet fria alternativet

"headers already sent"-fel

6 svar · 512 visningar · startad av andyoumaydie

andyoumaydieMedlem sedan dec. 2006608 inlägg
#1

Hallå gott folk.
Har satt mig ner för att lära mig lite php, och försöker lägga till ett enkelt inloggningsskript till en enkel "visa de tre senaste nyhetsinläggen-sida". :)

Men där stöter jag på patrull.

<?php
session_start(); // Alltid överst på sidan

//ini_set ("display_errors", "1");
include ("includes/include.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>icosonline.com</title>
        <link rel="SHORTCUT ICON" href="pics/memyself.ico" />
        <link href="includes/styles.css" type="text/css" rel="stylesheet" />
	</head>

	<body>
		<div id="container">
        	<div id="headpic">
            	<img src="pics/offview.jpg" alt="The view from my office." />
            </div>
        	
        	<div id="loginform">
            	<div class="divhead">
            		<h1>Please log in.</h1>
            	</div>
<?php
	// Inloggning
	if (isset($_POST['submit'])){
		$_POST = db_escape($_POST);

		$sql = "SELECT f_id FROM t_users
		WHERE f_namn='{$_POST['username']}'
		AND f_pass='{$_POST['password']}'";
		$result = mysql_query($sql);

		// Hittades inte användarnamn och lösenord
		// skicka till formulär med felmeddelande 
		if (mysql_num_rows($result) == 0){
			header("Location: default.php?badlogin=&name".$_POST['username']);
			exit;
		}

		// Sätt sessionen med unikt index
		$_SESSION['sess_id'] = mysql_result($result, 0, 'id');
		$_SESSION['sess_user'] = $_POST['user'];
		echo ("Du &auml;r inloggad! yeah...");
		//header("Location: welcome.php");
		exit;
	}

	// Utloggning
	if (isset($_GET['logout'])){
		session_unset();
		session_destroy();
		header("Location: default.php");
		exit;
	}
	// Om inte inloggad visa formulär, annars logga ut-länk
	if (!isset($_SESSION['sess_user'])){

		// Visa felmeddelande vid felaktig inloggning
		if (isset($_GET['badlogin'])){
			echo "<p>Fel användarnamn eller lösenord!<br />";
			echo "Försök igen!</p>";
		}
?>
            	<form name="login" action="<?php echo ($pageRoot); ?>default.php" method="post">
                <p class="infotext"><label for="username">Username:</label></p><input type="text" class="infield" id="username" name="username" value="<?php echo ($_GET['name']); ?>" />
                <p class="infotext"><label for="password">Password:</label></p><input type="password" class="infield" id="password" name="password" value="" />
                <input type="submit" class="button" id="loginbtn" name="loginbtn" onmouseover="this.className='button buttonhov'" onmouseout="this.className='button'" value="Login" />
                </form>
<?php 
	} else {
?> 
				<input type="button" class="button" id="loginbtn" name="loginbtn" onmouseover="this.className='button buttonhov'" onmouseout="this.className='button'" value="Logout" />
<?php
	}
?>
            </div>
            <div id="main">
            	<div class="divhead">
            		<h1>Latest news.</h1>
                </div>
<?php
// Hämta information från databasen 
$sql = mysql_query("SELECT `t_news`.`f_date` , `t_news`.`f_news`
FROM t_news
ORDER BY `t_news`.`f_date` DESC
LIMIT 0 , 3") or die("Kunde inte hämta info.");
// Presentera resultatet
while($result = mysql_fetch_array($sql)){
?>
	<div class="divpost">
    	<div class="posthead">
        	<h2><?php echo ($result['f_date']); ?></h1>
        </div>
        <p><?php echo ($result['f_news']); ?></p>
    </div>
<?php
}
?> 
            </div>
		</div>
	</body>
</html>

Denna kod genererar följande felmeddelande:
"Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at H:\PHP\www\default.php:1) in H:\PHP\www\default.php on line 2"

Och vad jag har läst mig till så borde det vara att jag har nån form av output innan första <?php-taggen, men det har jag inte, absolut ingenting är det innan den.

Så vad kan det vara som spökar?
/Patrik

PeeerMedlem sedan mars 20025 907 inlägg
#2

andyoumaydie skrev:

Och vad jag har läst mig till så borde det vara att jag har nån form av output innan första <?php-taggen, men det har jag inte, absolut ingenting är det innan den.

Nja, nästan rätt. Ingen output innan stället i koden som skickar vidare besökaren. Du har kanske ingenting innan din första php-tagg, men du avslutar taggen och skickar en massa htmlkod (dvs output) till klienten innan du försöker skicka vidare honom.

Ändra början till följande så borde det fungera fint sen:

<?php
session_start(); // Alltid överst på sidan
ob_start();

//ini_set ("display_errors", "1");
include ("includes/include.php");
?>

/r Ähum, jag läste nog lite väl dåligt. Fick för mig att det stog något om location. :r

andyoumaydieMedlem sedan dec. 2006608 inlägg
#3

Peeer skrev:

Nja, nästan rätt. Ingen output innan stället i koden som skickar vidare besökaren. Du har kanske ingenting innan din första php-tagg, men du avslutar taggen och skickar en massa htmlkod (dvs output) till klienten innan du försöker skicka vidare honom.

Ok, då var det jag som har missuppfattat det hela. :r

<?php
session_start(); // Alltid överst på sidan
ob_start();

//ini_set ("display_errors", "1");
include ("includes/include.php");
?>

Tyvärr så vill inte det där fungera heller.

Men jag får ju helt enkelt tänka om när jag ska skriva ut html-koden beroende på statusen på inloggningen eller vad man ska säga. :)

andyoumaydieMedlem sedan dec. 2006608 inlägg
#4
<?php
session_start(); // Alltid överst på sidan

//ini_set ("display_errors", "1");
include ("includes/include.php");

// Inloggning
if (isset($_POST['submit'])){
	$_POST = db_escape($_POST);
	$sql =	"SELECT f_id FROM t_users
			WHERE f_name='{$_POST['username']}'
			AND f_pass='{$_POST['password']}'";
	$result = mysql_query($sql);
	// Hittades inte användarnamn och lösenord
	// skicka till formulär med felmeddelande 
	if (mysql_num_rows($result) == 0){
		header("Location: default.php?badlogin=&name=".$_POST['username']);
		exit;
	}

	// Sätt sessionen med unikt index
	$_SESSION['sess_id'] = mysql_result($result, 0, 'f_id');
	$_SESSION['sess_user'] = $_POST['username'];
	header("Location: default.php");
	exit;
}

// Utloggning
if (isset($_GET['logout'])){
	session_unset();
	session_destroy();
	header("Location: default.php");
	exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>icosonline.com</title>
        <link rel="SHORTCUT ICON" href="pics/memyself.ico" />
        <link href="includes/styles.css" type="text/css" rel="stylesheet" />
	</head>

	<body>
		<div id="container">
        	<div id="headpic">
            	<img src="pics/offview.jpg" alt="The view from my office." />
            </div>
        	
        	<div id="loginform">
            	<div class="divhead">
            		<h1>Please log in.</h1>
            	</div>
<?php
	// Om inte inloggad visa formulär
	if (!isset($_SESSION['sess_user'])){

		// Visa felmeddelande vid felaktig inloggning
		if (isset($_GET['badlogin'])){
			echo "<p>Fel anv&auml;ndarnamn eller l&ouml;senord!<br />";
			echo "F&ouml;rs&ouml;k igen!</p>";
		}
?>
            	<form name="login" action="default.php" method="post">
                <p class="infotext"><label for="username">Username:</label></p><input type="text" class="infield" id="username" name="username" value="<?php echo ($_GET['name']); ?>" />
                <p class="infotext"><label for="password">Password:</label></p><input type="password" class="infield" id="password" name="password" value="" />
                <input type="submit" class="button" id="submit" name="submit" onmouseover="this.className='button buttonhov'" onmouseout="this.className='button'" value="Login" />
                </form>
<?php
	// Annars logga ut-knappen
	} else {
?> 
				<input type="button" class="button" id="loginbtn" onclick="document.location.href='default.php?logout' name="loginbtn" onmouseover="this.className='button buttonhov'" onmouseout="this.className='button'" value="Logout" />
<?php
	}
?>
            </div>
            <div id="main">
            	<div class="divhead">
            		<h1>Latest news.</h1>
                </div>
<?php
// Hämta nyheterna från databasen 
$sql = mysql_query("SELECT `t_news`.`f_date` , `t_news`.`f_news`
FROM t_news
ORDER BY `t_news`.`f_date` DESC
LIMIT 0 , 3") or die("Kunde inte hmta info.");
// Presentera resultatet
while($result = mysql_fetch_array($sql)){
?>
	<div class="divpost">
    	<div class="posthead">
        	<h2><?php echo ($result['f_date']); ?></h1>
        </div>
        <p><?php echo ($result['f_news']); ?></p>
    </div>
<?php
}
?> 
            </div>
		</div>
	</body>
</html>

Så där ja.

Detta fungerar alldeles utmärkt OM jag spara sidan som ANSI i anteckningar.

Sparar jag den som UTF-8 så får jag samma felmeddelanden som innan, dvs den här "header already sent"-grejen.

Och då till frågan, varför fungerar det inte med UTF-8?

clovecMedlem sedan dec. 200574 inlägg
#5

jag har haft många problem som detta och då har det hjälpt genom att jag har kagt till
ob_start(); efter session_start(); tycker det är konstigt att det inte fungerar så,,

andyoumaydieMedlem sedan dec. 2006608 inlägg
#6

Efter att ha sovit en timme :), lagt alla "header (Location)" i början OCH lagt till ob_start(); direkt efter session_start() så fungerar det hela utan problem.

Egentligen skulle man ju vilja markera bägge svaren som slutgiltiga eftersom clovec fick mig att inse vad Peeer egentligen skrev. :)

Tack till er båda.

clovecMedlem sedan dec. 200574 inlägg
#7

det var så lite så ;D

139 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)