1

quys,我的 PHP 应用程序有问题。

我有 2 页用于登录和注册。两个页面都使用公共cookies类。一切正常,除了一件事:setcookie()只在/signin页面上工作(cookie 值进入数据库,出现 cookie 'rwt')。

在注册页面上,cookie 值进入数据库,但setcookie()不起作用。

请帮忙。

PS这是唯一的问题,一切都可以在本地主机上运行,​​但不能在生产域上运行

PPS$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'");
                }
            }
        }
4

3 回答 3

2

我的经验是,设置 cookie 和发送 HTTP 回复的组合200 OK很容易很麻烦。您的方法可能很容易适用于某些浏览器,但不适用于其他浏览器。setcookie() 您可以通过使用before 来提高此工作的机会header('Location ...'),(因为某些浏览器在遇到标头时似乎停止解释标Location头)但这仍然不能保证。

一种解决方法是使用一次性 GET 参数重定向到您的目标位置并在那里设置 cookie。

于 2012-09-23T19:24:52.933 回答
1

您应该始终在通话exit后直接header('Location: ...')拨打电话。否则,您的脚本将继续运行直到结束,结果可能会出现一些意外行为。

我的猜测是,您稍后会在注册脚本中以某种方式取消设置 cookie。

于 2012-09-23T19:21:19.937 回答
0

解决方案

这是我的代码中的一个错误,它在本地服务器上工作真的很奇怪。

错误解释

我有if () {..}if () {..} else {..}注册过程相关的逻辑块。这很愚蠢,但我希望它们彼此相关。

将逻辑更改为if () {..} elseif () {..} else {..}已解决问题

我为这种蹩脚的错误道歉。

于 2012-09-25T14:19:15.243 回答