session_destroy和cookie过期后无法setcookie

时间:2015-07-17 17:27:32

标签: php cookies session-cookies

我在注销时销毁会话并且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将更新为空

2 个答案:

答案 0 :(得分:0)

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

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

应该是

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

}

答案 1 :(得分:0)

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

对于$ _COOKIE,使用setcookie()创建/删除的任何cookie都不会被删除或添加到$ _COOKIE,直到NEXT http请求为止。例如Cookie:标题必须从客户端往返,PHP只会根据用户提供的内容创建$ _COOKIE,而不是您发送的内容。

你有

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

... use new cookie immediately

由于这是一个新的Cookie,因此它不存在于$ _COOKIE中,因此您使用未定义的/ null值插入/更新您的表。