使用会话和cookie一起记住我


Using Session and Cookies together for remember me

在我的登录页面中,我同时使用会话和cookie,当记住我时,通常登录和cookie的会话被选中。我创建会话或设置cookie的代码是:

if(isset($_POST['login'])){ 
$username = $_POST['user_login'];
$password = $_POST['password_login'];
$stmt = $db->prepare("SELECT * FROM userss WHERE username = :username AND password = :password");
$stmt->execute(array(':username'=>$username,':password'=>$password));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$user_db = $row['username'];
$pass_db = $row['password'];
if($username == $user_db && $password == $pass_db) {  
    $_SESSION['username']=$username;
    if ($_POST['rememberme']!=NULL) {
        setcookie('username', $username,time()+31556926);
    }
    header("Location:main.php");
}

然后在任何页面上创建一个用户函数,我调用session或cookie,像这样:

if(isset($_COOKIE['username'])||isset($_SESSION['username'])) {
    $username = $_COOKIE['username'];
    $username = $_SESSION['username'];
}

现在我的问题是:

  1. 甚至当记住我被选中时,会话被使用,而不是cookie,我通过退出浏览器来测试它。我不知道代码哪里出错了。
  2. 在第二个代码if(isset($_COOKIE['username'])||isset($_SESSION['username'])) {是正确的,但我不确定如何为两种不同的情况定义用户名$username = $_COOKIE['username'];给我未定义索引用户名。可能是我设置cookie的方式出错了。

代替此处

if (isset($_POST['rememberme'])) {
setcookie('username', $username,time()+31556926);
}

在用户函数

if(isset($_SESSION['username']) {
      $username = $_SESSION['username'];
    }
 else if(isset($_COOKIE['username']){
      $username = $_COOKIE['username'];
    }
 else
    {
     //invalid ---
    }