我在注销时销毁会话并且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
将更新为空
答案 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值插入/更新您的表。