Печенье не сбрасывает
В моем сценарии входа в систему, если пользователь выбирает "запомнить меня", он устанавливает cookie следующим образом:
setcookie("a", $valuea, time()+2595000, "/");
setcookie("b", $valueb, time()+2595000, "/");
и когда пользователь (с помнить меня) выбирает logout, скрипт logout.php сбрасывает cookie следующим образом:
if(isset($_COOKIE['a']) && isset($_COOKIE['b'])){
setcookie("a","", time()-2595000, "/");
setcookie("b","", time()-2595000, "/");
setcookie(session_id(),"",time()-2595000, "/");
}
Однако после выхода из системы пользователь перенаправляется на страницу входа, и страница входа проверяет состояние входа пользователя с помощью следующего кода:
if($_COOKIE['a']=='' || $_COOKIE['b']==''){
echo 'You are not logged in.';
}else{
echo 'You are logged in with remember me.Your cookie is: '.$_COOKIE['a'].' and '.$_COOKIE['b'];
}
Но я обнаружил, что пользователь не вышел из системы, и cookie отображается со значением. Я не понимаю, почему setcookie не очищает значение cookie a и b. Любая идея?
4 ответа
Вы также можете использовать сессию:
Вот как в функции запомнить меня:
session_start();
$_SESSION['a'] = "valuea";
$_SESSION['b'] = "valueb";
И в функции выхода из системы:
session_unset();
session_destroy();
header("login.page")
И для проверки на странице входа в систему:
if(!isset(@_SESSION['a']) && !isset($_SESSION['b'])){
echo "You are not logged in.";
}
else{
echo "You are logged in with " . $_SESSION['a'] . 'and' . $_SESSION['b'];
}
В конце концов я нашел проблему. На самом деле в реальном коде, что происходило, я проверял $_COOKIE сразу после удаления на той же странице выхода из системы (не после перенаправления на страницу входа). Я забыл, что куки отправляются браузером, и если вы не перейдете на следующую страницу, изменения в куки не будут видны вам. Итак, если вы попробуете это в logout.php:
//deletion of cookies
if(isset($_COOKIE['a']) && isset($_COOKIE['b'])){
setcookie("a","", time()-2595000, "/");
setcookie("b","", time()-2595000, "/");
setcookie(session_id(),"",time()-2595000, "/");
}
//checking the existence of cookies
if($_COOKIE['a']=='' || $_COOKIE['b']==''){
echo 'You are not logged in.';
}else{
echo 'You are logged in with remember me.Your cookie is: '.$_COOKIE['a'].' and '.$_COOKIE['b'];
}
Тогда это даст вам ложную информацию. Хотя файлы cookie удалены, но вы увидите "Вы вошли в систему...................", потому что файлы cookie, полученные php в logout.php, останутся в php память, пока пользователь не перейдет на следующую страницу. Если вы проверите наличие этих файлов cookie на следующей странице, то увидите, что файлов cookie нет (они действительно были удалены).
У меня вопрос ко всем экспертам, есть ли способ перепроверить, действительно ли куки удаляются на той же странице после удаления?
Чтобы очистить файлы cookie при выходе из системы, установите их, указав только имя файла cookie, а не значения.
Как это:
setcookie('a');
setcookie('b');
setcookie(session_id());
Правильный способ удаления файлов cookie - установить дату окончания срока действия и оставить значение пустым, как показано ниже. Браузер автоматически удалит такой файл cookie. Этот пример также обсуждается в "Примере №2 setcookie() пример удаления"
С помощью unset($_COOKIE['a'])
не будет работать, так как он удалит только значение cookie в массиве и появится снова при следующей загрузке страницы. И, следовательно, изменения не будут влиять на значение в браузере.
<?
setcookie("a", "", time() - 3600);
?>