【问题标题】:PHP - setcookie(); not workingPHP - setcookie();不工作
【发布时间】:2013-12-17 11:40:45
【问题描述】:

我已经登录,它设置了一个带有估算电子邮件地址值的 cookie,因此在 global.php 文件中,它使用以下方式存储了一个用户数据数组:

$email = $_COOKIE["PeopleHub"];
$getuserdata = mysqli_query($con, "SELECT * FROM Earth WHERE email='$email'");
$userdata = mysqli_fetch_array($getuserdata, MYSQLI_ASSOC);

cookie 没有设置,我知道这是因为我制作了一个测试文件:

echo $_COOKIE["PeopleHub"];

它只是做了一个空白页。

登录代码(设置cookie的地方):

<?php 
include "global.php";    
?>
<h2>Login</h2>
<?php 
    echo "We currently have <b>" . $usercount . "</b> members, <b>" . $onlinecount . "</b> of which are online. "; 
?>
<br>
<br>
<?php 
    if(isset($_POST["email"])){ 
        $email = $_POST["email"];
        $password = sha1($_POST["password"]);
        $check = mysqli_query($con, "SELECT * FROM Earth WHERE `email`='$email' AND `password`='$password'");
        $check = mysqli_num_rows($check);
        if($check == 1){
        setcookie("PeopleHub", $email, 0, '/');
        echo "We logged you in!";
        }
        else { 
            echo "We couldn't log you in!";
        }
    }
?>
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">
    Email <input name="email" placeholder="Email Address" required="" type="text"><br>
    Password <input name="password" placeholder="Password" required="" type="password"><br>
    <input type="reset" value="Start Over">
    <input type="submit" value="Login">
</form>

【问题讨论】:

  • 只是在这里说,但你应该清理你的数据,因为你放在那里的代码非常容易受到 SQLI 攻击
  • 不,序列化数据不是一个伟大的选项。考虑准备好的语句或 PDO。

标签: php cookies


【解决方案1】:

您必须在发送任何标头之前设置 cookie。

来自the manual

setcookie() 定义了一个 cookie 与其余的 HTTP 标头一起发送。与其他标头一样,必须在脚本的任何输出之前发送 cookie(这是协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空格。

这意味着如果您想按原样使用此代码,则需要查看output buffering

<?php

ob_start();
echo "Hello\n";

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>

根据global.php 的内容,这可能适合你。我所做的只是在调用setcookie() 之前删除任何输出。如果 global.php 包含任何空格或 HTML 输出,这将不起作用:

<?php 
include "global.php";    

    if(isset($_POST["email"])){ 
        $email = $_POST["email"];
        $password = sha1($_POST["password"]);
        $check = mysqli_query($con, "SELECT * FROM Earth WHERE `email`='$email' AND `password`='$password'");
        $check = mysqli_num_rows($check);
        if($check == 1){
        setcookie("PeopleHub", $email, 0, '/');
        echo "We logged you in!";
        }
        else { 
            echo "We couldn't log you in!";
        }
    }
?>
<h2>Login</h2>
<?php 
    echo "We currently have <b>" . $usercount . "</b> members, <b>" . $onlinecount . "</b> of which are online. "; 
?>
<br>
<br>
<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">
    Email <input name="email" placeholder="Email Address" required="" type="text"><br>
    Password <input name="password" placeholder="Password" required="" type="password"><br>
    <input type="reset" value="Start Over">
    <input type="submit" value="Login">
</form>

【讨论】:

  • 点击我给你的输出缓冲链接。有一个实际使用 setcookie() 的例子。
  • 如果我把 ob_start();在全局文件的顶部?
  • 是的。只需确保在每个文件的末尾也调用 ob_end_flush()。
  • 在包含 setcookie() 的全局核心函数文件中定义一个自定义函数,如函数 cookie_set(),并在 html 代码的顶部使用该函数。如果要删除 cookie,只需使用同样的方法与 unset($_COOKIE['cookiename']) 和 setcookie('cookiename',NULL,time()-3600, '/')
【解决方案2】:

只是想指出,我遇到了 setcookie 无法正常工作的问题。当我进一步调查该文件时,它被编码为带有 BOM 的 UTF-8。当我将它重新编码为没有 BOM 的 UTF-8 时,setcookie 工作正常,所以在遇到我的第一个 php 标记之前就编写了 BOM。我想在我的 php.ini 文件中启用缓冲可能也会解决这个问题。

最终有人可能会发现这些信息很有帮助。

【讨论】:

  • 这就是您使用 Notepad++ 所获得的! :)
  • 谢谢罗伯特!但是 Notepad++ 默认为没有 BOM 的 UTF-8 ......你在说什么,克里斯蒂安?我认为是 Visual Studio Express 在我的案例中添加了 BOM。
  • 是的,Notepad++ 通常默认为没有 BOM 的 UTF-8。但是,如果您或与您一起工作的人使用其他工具,很容易得到一个看起来不错的文件,但 PHP 会发送 BOM 并破坏 cookie。例如,我在异构环境中工作,一些 IDE 默认使用 UTF-8 和 BOM。
【解决方案3】:

我在使用 setcookie 函数更新 cookie 时遇到了另一个问题。

所以我使用 php 序列化函数设置了由数组组成的 cookie 字符串。从现在开始,我无法更新该 cookie - setcookie 函数根本不起作用,它正在设置序列化字符串或任何其他简单字符串。

然后我用新的 cookie 键设置了另一个 cookie,这次数据是用 json_encode 函数编码的。这次我可以设置 cookie 并更新它:-)

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,结果证明这是因为我传递给函数的域有一个自定义端口(这是不允许的)。

    【讨论】:

      【解决方案5】:

      只是想补充一点,当用户使用我的网站时,setcookie 对我不起作用:https://mywebsite89898989.com。但是当网站 url 更改为 https://www.mywebsite89898989.com 时,setcookie 工作正常。

      我与专家相差甚远,所以也许更有知识的人可以解释这种行为。

      我只是记下这些信息,希望能节省一些调试时间...

      【讨论】:

        【解决方案6】:

        我的情况稍微有点奇怪:原来我的广告拦截器(我使用 1Blocker)会杀死具有某些名称的 cookie。在我的例子中,它是一个以 _login 结尾的 cookie 名称。我改了名字,它开始工作了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2015-03-25
          • 1970-01-01
          相关资源
          最近更新 更多