我在用下面的代碼的問題:http://pastebin.com/MCkhzQjsPHP - 問題與cookies/setCookie方法
這個本地工作(在本地主機上),但是當我把它上傳到它不登錄服務器。我認爲這是與餅乾不發送。元刷新是爲了在設置cookie後刷新頁面。感謝任何幫助。
我在用下面的代碼的問題:http://pastebin.com/MCkhzQjsPHP - 問題與cookies/setCookie方法
這個本地工作(在本地主機上),但是當我把它上傳到它不登錄服務器。我認爲這是與餅乾不發送。元刷新是爲了在設置cookie後刷新頁面。感謝任何幫助。
您是否啓用了error_reporting?你的代碼在第一個php-tag之前包含空格,什麼是輸出並強制服務器發送頭文件(error_reporting應該給你一個關於它的通知)。
答案很簡單。
您只能設置cookie,啓動會話,設置標題如果在PHP代碼塊外沒有內容echo'd或發送(包括html)。
例子:
將不起作用:
<div>
<?php setcookie(/*....*/); ?>
</div>
原因:由於<div>
已發送迫使頭髮送,還有餅乾不能被添加到頭部,因爲有發送
另:
<?php
setcookie(/*....*/); //works
echo "test";
setcookie(/*....*/); //does not
?>
你代碼應該如下所示:
$title = "Admin panel";
if(!isset($_COOKIE['login'])) $_COOKIE['login'] = false;
if(!isset($_POST['password'])) $_POST['password'] = false;
if($_POST['password'] == "tt83df")
{
if(isset($_POST['permlog']))
{
$expire = time()+60*60*24*365;
setcookie("login", "tt83df", $expire, "/admin");
}
else
{
setcookie("login", "tt83df", 0, "/admin");
}
header("Location: " . $_SERVER['PHP_SELF']);
exit;//Stop here and SEND Headers
}
if($_COOKIE['login'] == "tt83df")
{
$html = '<ul><li><a href="news_panel.php">News control panel</a></li><li><a href="video_panel.php">Video control panel</a></li><li><a href="schedule_panel.php">Schedule control panel</a></li>
<li><a href="events_panel.php">Events control panel</a></li><li><a href="notices_panel.php">Notices control panel</a></li></ul>';
}else
{
$html = 'Password:<form method="post"><input type="password" name="password" /><input type="submit" value="Submit"><br />
<input type="checkbox" name="permlog" value="true" /> Stay logged in? (do not use on a public computer)</form>';
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/vnd.microsoft.icon" href="images/favicon.ico" />
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $html; ?>
</body>
</html>
我認爲問題包括在將HTML寫入輸出流之後設置cookie。 Cookies或標題修改只能在標題發送之前完成。將內容寫入輸出流迫使標題自動寫入。
嘗試在代碼頂部使用ob_start();
,在底部使用ob_end_flush();
。這將初始化一個緩衝區,該緩衝區將填充寫入輸出流的所有內容。所以基本上。 ob_start
用於初始化輸出緩衝區,而ob_end_flush
用於將緩衝區寫回客戶端。
請發表真實的代碼。由於語法錯誤,您的代碼片段甚至無法運行。 – 2010-12-09 22:46:22
http://pastebin.com/MCkhzQjs – John 2010-12-09 22:53:46