quys,我的PHP应用程序出了问题。
我有2页用于登录和注册。两个页面都使用常见的cookies
类。一切正常,除了一件事:setcookie()
仅适用于/signin
页面(cookie值转到数据库,并且出现cookie'rwt'。
在注册页面上,cookie值将转到数据库,但setcookie()
不起作用。
请帮助。
P.S。这是唯一的问题,一切都适用于localhost,但不适用于生产域
P.P.S $DBH
是PDO变量,包含正确的数据库信息。
登录页面
$cookie = new Cookies($DBH);
........
if ($signin->remember=="yes") {
$cookie->account_set($signin->user);
}
注册页面
$cookie = new Cookies($DBH);
.........
........
if ($signup->check_availability()) {
$signup->save();
$cookie->account_set($signup->user);
header("Location:/");
} else {
$msgText = "This username already exists";
echo "<div class=\"orangeMsg\">$msgText</div>";
}
班级cookies
class Cookies
{
private $_DBH, $cookie_domain;
function __construct(PDO $DBH)
{
$this->_DBH=$DBH;
$this->cookie_domain=$_SERVER['HTTP_HOST'];
}
public function account_set($value)
{
$cookie_value=uniquestr();
// function from common.func.php
$this->_DBH->query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$value'");
setcookie('rwt', $cookie_value, time()+60*60*24*7 , '/', $this->cookie_domain);
}
public function account_unset($value)
{
if (isset($_COOKIE['rwt'])) {
$cookie_value=$_COOKIE['rwt'];
setcookie("rwt", $cookie_value, time()-2592000, '/', $this->cookie_domain);
$this->_DBH->query("UPDATE accounts SET cookie=DEFAULT WHERE user='$value'");
}
}
}
答案 0 :(得分:2)
我的经验是,设置cookie和发送除200 OK
之外的HTTP回复的组合很容易出错。可能很容易,您的方法适用于某些浏览器,但不适用于其他浏览器。您可以在 setcookie()
之前使用header('Location ...')
来提高此工作的可能性(因为某些浏览器似乎在遇到Location
标头时停止解释标头)但这仍然无法保证。
解决方法是使用一次性GET参数重定向到目标位置并在那里设置cookie。
答案 1 :(得分:1)
在exit
来电后,总是直接拨打header('Location: ...')
。否则,您的脚本将继续运行直到结束,结果可能会出现一些意外行为。
我的猜测是,您稍后会在注册脚本中取消设置cookie。
答案 2 :(得分:0)
的解 的
我的代码出了问题,它在本地服务器上工作真的很奇怪。
MISTAKE EXPLANATION
我有与注册过程相关的if () {..}
和if () {..} else {..}
个逻辑块。这是愚蠢的,但我希望它们彼此相关。
将逻辑更改为
if () {..} elseif () {..} else {..}
已解决了问题 问题
我为这种蹩脚的错误道歉。