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 ä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
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
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. :)
<?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ändarnamn eller lösenord!<br />";
echo "Försö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 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å,,
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.