我做了一个登录,它设置了一个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>
7条答案
按热度按时间fd3cxomn1#
您必须在发送任何标题 * 之前 * 设置cookie。
从the manual开始:
setcookie()定义了一个与HTTP头一起发送的cookie。与其他头一样,cookie必须在脚本输出之前发送(这是一个协议限制)。这要求您在任何输出之前调用此函数,包括和标记以及任何空白。
这意味着如果您希望按原样使用此代码,则需要查看output buffering。
根据
global.php
的内容,这 * 可能 * 适合您。我所做的只是在调用setcookie()
之前删除所有输出。如果global.php
中包含任何空格或HTML输出,这将不起作用:t30tvxxf2#
我只是想指出,我有一个问题,setcookie不工作.当我进一步调查文件,它被编码为UTF-8与BOM.当我重新编码为UTF-8没有BOM setcookie工作正常,所以BOM是写之前,我的第一个php标签遇到.我想在我的php.ini文件中启用缓冲可能会解决这个问题.
最终可能会有人发现这些信息很有帮助。
9jyewag03#
我遇到了同样的问题,结果发现这是因为我传递给函数的域有一个自定义端口(这是不允许的)。
svmlkihl4#
使用setcookie函数更新cookie时我遇到了另一个问题。
所以我用php的serialize函数设置了由数组生成的cookie字符串,从现在开始我无法更新cookie - setcookie函数根本不起作用,不管是设置序列化字符串还是其他简单的字符串。
然后我用新的cookie键设置了另一个cookie,这次数据是用json_encode函数编码的。这次我可以设置cookie并更新它:-)
vmjh9lq95#
我的案子有点奇特:原来我的广告拦截器(我使用1Blocker)会杀死某些名称的cookie。在我的例子中,它是一个以
_login
结尾的cookie名称。我更改了名称,它开始工作。t30tvxxf6#
只是想补充一点,当用户使用我的网站时,setcookie对我不起作用,网址如下:但是当网站网址被更改为https://www.mywebsite89898989.com时,setcookie工作正常。
我离Maven还很远,所以也许有更有知识的人可以解释这种行为。
我只是记录下这些信息,希望能保存一些调试时间...
xqkwcwgp7#
如果您正在使用XAMPP,您可能会发现以下内容很有帮助:今天我试着找出一个cookie bug的原因。在我本地的XAMPP服务器上setcookie()运行正常,但是当我把项目上传到我的虚拟主机时它就停止工作了,cookie没有被设置。XAMPP使用PHP v8.1.10,而虚拟主机使用PHP v8.1.16,所以版本差异不是bug的原因。
我发现我的错误是在调用setcookie()之前输出了一些文本(所以HTTP头已经发送了),但我不知道为什么它在localhost/XAMPP上工作,它真的不应该是这样的。