PHP在PayPal回拨后更新cookie

时间:2016-07-25 04:37:06

标签: php cookies

因此返回正常,我可以使用新设置设置数据库唯一的问题是获取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), '/');
    }
}

1 个答案:

答案 0 :(得分:2)

某些背景:

HTTP响应(从您的服务器到浏览器)包括告诉浏览器内容和内容本身的标题。标题必须在内容之前发送。 Cookie在标题中设置。

问题

您的setcookie无法正常工作,因为它已在某些内容发送到浏览器后发生(我们知道这是因为headers_sent()true。内容包括PHP标记<?php ?>包括任何HTML和开始标记之前的任何空格。

解决方案1 ​​

另一种解决方法是使用输出缓冲。这意味着当您将内容发送到浏览器时,PHP会将其保留在缓冲区中,直到缓冲区已满或脚本结束。如果您稍后发送了一些标题(例如:setcookie),那么您将没有任何问题,因为实际上没有任何内容发送到浏览器。

要使用此解决方案,请在发送任何内容之前启动输出缓冲区:

<?php
ob_start();

然后在脚本结束时,刷新缓冲区。这会将缓冲区中的所有内容发送到浏览器

ob_end_flush();

See the docs

注意:您可以自动将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.
}

该消息将为您提供首次向浏览器发送内容的文件名和行号。

See the docs.