Warning: Cannot send session cookie - headers already sent by

Tags:    php

Jeg er lige begyndt at programmere PHP / mysql og jeg er stødt på mit første rigtige problem.

Jeg vil lave en side det består af en tabel med en stor celle(til et billede) for oven og 3 mindre celler neden under.

I den første celle i de små tabeller vil jeg have nogle links. I den midterste kører jeg en simpel gæstebog og i den tredje skal input felterne til min login funktion være.

Jeg er nået så langt at jeg har både links og gæste bog til at køre...Alt virker som det skal.

Jeg har også hentet en login funktion her fra siden, der virker fint når jeg kører den for sig selv. Problemet opstår når jeg includer filen i den 3. celle i tabellen.

Mit spørgsmål går her på hvordan jeg kommer omkring problemet, da min login-funktion danner disse session variable og af designmæssige årsager skal ligge i 3. tabel række? I får lige koden fra login funktionen, efter jeg har tilpasset den:

<?php
if (!isset($send)) {
?>
<form action="loginforside.php" method=post>
Login:<br>
<input type=text name=name size=30 maxlength=30><br>
Password:<br>
<input type=password name=pass size=30 maxlength=30><br>
<input type=submit name=send>
<?php
} else {
$password = ($pass);
$sql_host = "localhost"; //dit host
$sql_user = "stoederne"; //dir brugernavn
$sql_passwd = "smaksmak";//din kode
$db = "stoederne"; //din database
mysql_connect($sql_host,$sql_user,$sql_passwd)or die (mysql_error());
mysql_select_db($db)or die (mysql_error());
$result = mysql_query ("SELECT * FROM logon WHERE pwnavn = 'Thomas'"); //'".$name."');
if (!$result) {
echo "Det indtastede brugernavn eksisterer ikke";
};
while ($row = mysql_fetch_array($result)) {
$check = $row["password"];
};
if (($password) === ($check)) {
session_register("pwnavn");
session_register("password");
echo ("Du er nu logget ind I vores system!");
} else {
echo ("Du kunne ikke logge ind!");
}
}
?>

Siden der kalder login funktionen ser sådan her ud:

<html>
<table width="965" border="0" cellpadding="0" cellspacing="1">
<!--DWLayoutTable-->
<tr>
<td height="181" colspan="5" valign="top"><img src="LOGO-smaller.jpg" width="965" height="181"></td>
<td width="1"></td>
</tr>
<tr>
<td width="172" height="3"></td>
<td width="6"></td>
<td width="603"></td>
<td width="7"></td>
<td width="173"></td>
<td></td>
</tr>
<tr>
<td height="428" align="left" valign="top" bgcolor="#CCCCCC">
<?php
include("/var/www/fastweb/users/stoederne/gbog/logon.php");
?>
<p><a href="www.stoederne.fastweb.dk" title="Stoedernes hjemmeside">blah</a></p></td>
<td></td>
<td align="center" valign="top" bgcolor="#cccccc"> <p>
<?php
include("/var/www/fastweb/users/stoederne/gbog/gbog.php");
?>
</p>
<p></p>
<td>
<td align="center" valign="top" bgcolor="#cccccc">

<td> </td>
</tr>

<tr>
<td height="0">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</html>



1 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Her er svaret, direkte fra den officielle php manual c")

Note: If you are using cookie-based sessions, you must call session_start() before anything is output to the browser.

I det øjeblik du kalder session_register() funktionen kaldes session_start() automatisk for at oprette eller genoprette en tidligere session. Når du benytter cookies, hvilket er normalt, sendes cookie-informationer med SESSION_ID til brugeren.

Her kommer så den drilske del, cookie-informationer skal udveksles gennem HTTP-headeren! I det øjeblik der kommer bare et bogstav html information, dette inkluderer også brugen af echo, før functionen session_start() kaldes, er det for sent idet headeren allerede sendt!

Du har altså brug for, at tilføje følgende i toppen af den side som inkluderer dit login script.

<?PHP session_start(); ?>

Bare rolig... det har ingen anden effekt end, at der oprettes en session med brugeren, selvom man kalder funktionen igen senere i scriptet har det ingen effekt, idet de selv kontrollerer om der er oprettet en session.

Bemærk at funktionen skal kaldes før du får adgang til de sessionvariable du har gemt for brugeren.

Go' nat :o)



t