因此返回正常,我可以使用新设置设置数据库唯一的问题是获取cookie以反映时间范围到期时用户状态的变化。
if ($prem_user == 1) {
// prem user
if ($data->prem_exp < time())
{
$query = "UPDATE members SET prem_status='0', prem_exp='0' WHERE id='$data->id'";
mysqli_query($conn, $query);
// re build Cookie for new information
$sql = "SELECT * FROM members WHERE email = '$data->email' AND password = '$data->password'";
$result = $conn->query($sql) or die(var_dump($conn));
if ($result->num_rows != 1) {
// security issue send to index for logic to handle
header("LOCATION : /index.php");
}
$data = json_encode($result->fetch_array(MYSQLI_ASSOC));
setcookie('account', $data, time() + (86400 * 30), '/');
}
}
答案 0 :(得分:2)
某些背景:
HTTP响应(从您的服务器到浏览器)包括告诉浏览器内容和内容本身的标题。标题必须在内容之前发送。 Cookie在标题中设置。
问题
您的setcookie
无法正常工作,因为它已在某些内容发送到浏览器后发生(我们知道这是因为headers_sent()
是true
。内容包括PHP标记<?php
?>
包括任何HTML和开始标记之前的任何空格。
解决方案1
另一种解决方法是使用输出缓冲。这意味着当您将内容发送到浏览器时,PHP会将其保留在缓冲区中,直到缓冲区已满或脚本结束。如果您稍后发送了一些标题(例如:setcookie
),那么您将没有任何问题,因为实际上没有任何内容发送到浏览器。
要使用此解决方案,请在发送任何内容之前启动输出缓冲区:
<?php
ob_start();
然后在脚本结束时,刷新缓冲区。这会将缓冲区中的所有内容发送到浏览器
ob_end_flush();
注意:您可以自动将PHP设置为,通过在 php.ini
output_buffering = 4096
解决方案2
解决方案是在发送任何内容之前设置cookie。如果您不确定发送内容的位置,请执行以下代码而不是setcookie
:
$file=null;
$line=null;
if(headers_sent($file,$line)){
//headers have been sent. too late to set a cookie
die("Can't set cookie: Content sent in $file on line $line");
}else{
setcookie(...); // cookie header can still be set.
}
该消息将为您提供首次向浏览器发送内容的文件名和行号。