在 session_destroy 和 cookie 过期后无法设置 cookie

can't setcookie after session_destroy and cookie expire

我在注销时销毁会话并 setcookie 过去以便我可以使它过期,在下一次身份验证时我无法再次设置 cookie。这是我的注销:

session_start();
unset($_SESSION['id_user']);
session_destroy();
setcookie('logat', '', time() - 3600);
header("location: index.php"); 

这里是我setcookie关于身份验证的地方:

<?php
header('Content-Type: application/json');
session_start();
include('engine/core/dbconfig.php');
$password   = $_POST['password'];
$email      = $_POST['email'];
$hash       = hash('sha512', $password);
$hash_email = hash('sha512', $email);

$stmtt = $dbh->prepare("SELECT * FROM Users where Email=:email and Password= :hashed");
$stmtt->bindParam(':email', $email);
$stmtt->bindParam(':hashed', $hash);
$stmtt->execute();
if ($row = $stmtt->fetch()) {

    setcookie('logat', $hash_email, time() + (60 * 60 * 24 * 1000));

    $stmt = $dbh->prepare("Update Users SET Cookie_Log=:cookie_log where ID_User=:id_user");
    $stmt->bindParam(':id_user', $row['ID_User']);
    $stmt->bindParam(':cookie_log', $_COOKIE['logat']);
    $stmt->execute();
    $stmt = $dbh->prepare("Update Cos SET ID_User=:id_user where cookie=:cookie_cos");
    $stmt->bindParam(':id_user', $row['ID_User']);
    $stmt->bindParam(':cookie_cos', $_COOKIE['cos']);
    $stmt->execute();
    $_SESSION['id_user'] = $row['ID_User'];
    $arr                 = array(
        'tip' => 'user',
        'id' => '' . $_SESSION['id_user'] . ''
    );

}
?>

我做了一个测试,似乎设置了 cookie,但它没有插入到数据库中。第一次登录时它被插入但在注销并重新登录后列 Cookie_Log 更新为空

这只是 if ($row = $stmtt->fetch()) 上的一个小错误,您使用的是赋值运算符,请改用 ==

BTW 事件 ($row == $stmtt->fetch()) 永远不会等于 true,因为 $row 在有条件地检查之前是空的。

应该是

$row=...
if($row == $stmtt->fetch()){

}

这是时间问题。 PHP 超级全局变量在脚本首次启动时设置一次,然后在脚本的生命周期内再也不会被 PHP 触及。

在 $_COOKIE 的情况下,您 create/delete 使用 setcookie() 的任何 cookie 都不会被删除或添加到 $_COOKIE,直到下一个 http 请求。例如Cookie: header 必须从客户端往返,而 PHP 仅使用用户返回的内容创建 $_COOKIE,而不是您发送的内容。

你有

setcookie(... new cookie...);

... use new cookie immediately

因为这是一个新的 cookie,它不存在于 $_COOKIE 中,因此您 inserting/updating 您的 table 具有 undefined/null 值。