PHP-设置cookie();不工作

gr8qqesn  于 2023-02-28  发布在  PHP
关注(0)|答案(7)|浏览(167)

我做了一个登录,它设置了一个cookie,该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>
fd3cxomn

fd3cxomn1#

您必须在发送任何标题 * 之前 * 设置cookie。
the manual开始:
setcookie()定义了一个与HTTP头一起发送的cookie。与其他头一样,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>
t30tvxxf

t30tvxxf2#

我只是想指出,我有一个问题,setcookie不工作.当我进一步调查文件,它被编码为UTF-8与BOM.当我重新编码为UTF-8没有BOM setcookie工作正常,所以BOM是写之前,我的第一个php标签遇到.我想在我的php.ini文件中启用缓冲可能会解决这个问题.
最终可能会有人发现这些信息很有帮助。

9jyewag0

9jyewag03#

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

svmlkihl

svmlkihl4#

使用setcookie函数更新cookie时我遇到了另一个问题。
所以我用php的serialize函数设置了由数组生成的cookie字符串,从现在开始我无法更新cookie - setcookie函数根本不起作用,不管是设置序列化字符串还是其他简单的字符串。
然后我用新的cookie键设置了另一个cookie,这次数据是用json_encode函数编码的。这次我可以设置cookie并更新它:-)

vmjh9lq9

vmjh9lq95#

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

t30tvxxf

t30tvxxf6#

只是想补充一点,当用户使用我的网站时,setcookie对我不起作用,网址如下:但是当网站网址被更改为https://www.mywebsite89898989.com时,setcookie工作正常。
我离Maven还很远,所以也许有更有知识的人可以解释这种行为。
我只是记录下这些信息,希望能保存一些调试时间...

xqkwcwgp

xqkwcwgp7#

如果您正在使用XAMPP,您可能会发现以下内容很有帮助:今天我试着找出一个cookie bug的原因。在我本地的XAMPP服务器上setcookie()运行正常,但是当我把项目上传到我的虚拟主机时它就停止工作了,cookie没有被设置。XAMPP使用PHP v8.1.10,而虚拟主机使用PHP v8.1.16,所以版本差异不是bug的原因。
我发现我的错误是在调用setcookie()之前输出了一些文本(所以HTTP头已经发送了),但我不知道为什么它在localhost/XAMPP上工作,它真的不应该是这样的。

相关问题