Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-setcookie();不起作用_Php_Cookies - Fatal编程技术网

PHP-setcookie();不起作用

PHP-setcookie();不起作用,php,cookies,Php,Cookies,我做了一个登录,它用输入的电子邮件地址的值设置了一个cookie,所以在global.php文件中,它存储了一个用户数据数组,使用: $email = $_COOKIE["PeopleHub"]; $getuserdata = mysqli_query($con, "SELECT * FROM Earth WHERE email='$email'"); $userdata = mysqli_fetch_array($getuserdata, MYSQLI_ASSOC); 未设置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):


登录


在发送任何标题之前,必须设置cookies

发件人:

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

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

<?php

ob_start();
echo "Hello\n";

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>

我只是想指出,我对setcookie不起作用有一个问题。当我进一步研究该文件时,它被编码为UTF-8和BOM。当我将其重新编码为UTF-8而不使用BOM setcookie时,效果很好,因此BOM是在遇到第一个php标记之前编写的。我想在我的php.ini文件中启用缓冲可能也会解决这个问题


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

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

所以我使用php序列化函数设置了从数组生成的cookie字符串。从现在起,无论是设置序列化字符串还是任何其他简单字符串,我都无法更新cookie-setcookie函数根本不起作用


然后我用新的cookie键设置了另一个cookie,这次数据是用json_encode函数编码的。这次我能够设置cookie并对其进行更新:-)

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

单击我给您的输出缓冲链接。有一个实际使用setcookie()的示例。如果我将ob_start()放在;在全局文件的顶部?是的。只需确保在每个文件的末尾也调用ob_end_flush()。在包含setcookie()的全局核心函数文件中定义一个自定义函数,如函数cookie_set(),并在html代码顶部使用该函数。如果要删除cookie,只需对unset($_cookie['cookiename'])和setcookie使用相同的方法即可('cookiename',NULL,time()-3600,“/”)这就是使用记事本++!:)谢谢罗伯特!但是Notepad++默认为不带BOM的UTF-8。。。你在说什么,克里斯蒂安?我想是Visual Studio Express在我的案例中添加了BOM。是的,Notepad++通常默认为不带BOM的UTF-8。但是,如果您或您的同事使用了其他工具,很容易得到一个看起来不错的文件,但是PHP会发送BOM并破坏cookie。例如,我在一个异构环境中工作,一些IDE默认为带BOM的UTF-8。考虑准备好的陈述或PDO。
<?php

ob_start();
echo "Hello\n";

setcookie("cookiename", "cookiedata");

ob_end_flush();

?>
<?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>