我在使用以下代码时遇到问题:http: //pastebin.com/MCkhzQjs
这在本地工作(在本地主机上)但是当我将它上传到服务器时它没有登录。我认为这与未发送cookie有关。元刷新是为了在设置 cookie 后刷新页面。感谢您的帮助。
我在使用以下代码时遇到问题:http: //pastebin.com/MCkhzQjs
这在本地工作(在本地主机上)但是当我将它上传到服务器时它没有登录。我认为这与未发送cookie有关。元刷新是为了在设置 cookie 后刷新页面。感谢您的帮助。
答案很简单。
如果在 php 代码块之外没有内容回显或发送(包括 html),您只能设置 cookie、启动会话、设置标头。
例子:
不会工作:
<div>
<?php setcookie(/*....*/); ?>
</div>
原因:因为<div>
已经发送了强制发送标头,所以无法将cookie添加到标头中,因为已发送
其他:
<?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>
您是否启用了 error_reporting?您的代码在第一个 php-tag 之前包含空格,什么是输出并强制服务器发送标头(error_reporting 应该给您一个通知)。
我认为问题在于在将 HTML 写入输出流之后设置 cookie。Cookie 或标头修改只能在标头发送之前完成。将内容写入输出流会强制自动写入标头。
尝试ob_start();
在代码的顶部和ob_end_flush();
底部使用。这将初始化一个缓冲区,该缓冲区将填充写入输出流的所有内容。所以基本上。ob_start
用于初始化输出缓冲区,并将ob_end_flush
缓冲区写回客户端。