PHP会话、COOKIES和“记住我”函数

PHP会话、COOKIES和“记住我”函数,php,session,cookies,Php,Session,Cookies,我有以下代码,当用户登录时,会显示两个文本框和一个复选框 设置三个cookie,用户名,密码和记住所有的工作和登录脚本本身都非常好(我知道在cookie中存储散列密码不是最佳做法,但现在就可以了) 然而,发生的情况是,当用户在登录时重新访问login.php页面(这一个),cookies会一个接一个地被删除,因为$u POST条件没有得到满足,因此下面的行正在被执行。我怎样才能防止这种情况发生。此外,任何关于清理代码的建议,我都将毫无疑问地以大量重复代码结束,我们将不胜感激。谢谢 下面“logi

我有以下代码,当用户登录时,会显示两个文本框和一个复选框

设置三个cookie,
用户名
密码
记住
所有的工作和登录脚本本身都非常好(我知道在cookie中存储散列密码不是最佳做法,但现在就可以了)

然而,发生的情况是,当用户在登录时重新访问
login.php
页面(这一个),cookies会一个接一个地被删除,因为$u POST条件没有得到满足,因此下面的行正在被执行。我怎样才能防止这种情况发生。此外,任何关于清理代码的建议,我都将毫无疑问地以大量重复代码结束,我们将不胜感激。谢谢

下面“login.php”页面的代码片段

} elseif (!$_POST['remember']) {
    $past = time() - 100;
    if (isset($_COOKIE['remember'])) {
        setcookie('remember', '', $past);
    } elseif (isset($_COOKIE['username'])) {
        setcookie('username', '', $past);
    } elseif (isset($_COOKIE['password'])) {
        setcookie('password', '', $past);
    }
}
login.php

<?php
session_start();
include("includes/config.php");

?>
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
<?php

$odb = new PDO("mysql:host=" . DB_SERVER . ";dbname=" . DB_NAME, DB_USER, DB_PASS);

$username = "";
$password = "";

if (isset($_COOKIE['username']) && isset($_COOKIE['password'])) {

    $username = $_COOKIE['username'];
    $password = $_COOKIE['password'];

} elseif (isset($_POST['username'])) {

    $username = $_POST['username'];
    $password = $_POST['password'];
    $password = md5(DB_SALT.$password);

}

$sql = "SELECT * from tblMembers WHERE username = :username";
$query = $odb->prepare($sql);
$query->execute(array(":username" => $username));
$results = $query->fetchAll();
if($results !== FALSE && $query->rowCount()>0) {
    if($results[0]['passwordHash'] == $password) {
        $_SESSION['username'] = $username;
        $_SESSION['userID'] = $results[0]['userID'];

        if($_POST['remember']) {
            $month = time() + (60 * 60 * 24 * 30);
            setcookie('remember', $_POST['username'], $month);
            setcookie('username', $_POST['username'], $month);
            setcookie('password', $results[0]['passwordHash'], $month);
        } elseif (!$_POST['remember']) {
            $past = time() - 100;
            if (isset($_COOKIE['remember'])) {
                setcookie('remember', '', $past);
            } elseif (isset($_COOKIE['username'])) {
                setcookie('username', '', $past);
            } elseif (isset($_COOKIE['password'])) {
                setcookie('password', '', $past);
            }
        }


        header("Location: "."index.php");
    } else {
        echo "password incorrect";
    }
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
Username:&nbsp;
<?php
if(isset($_COOKIE['username'])) {
    echo "<input type=\"text\" id=\"username\" name=\"username\" maxlength=\"40\" value=".$_COOKIE['username'].">";
} else {
    echo "<input type=\"text\" id=\"username\" name=\"username\" maxlength=\"40\" value=\"\">";
}
?>
Password:&nbsp;<input type="password" id="password" name="password" maxlength="50">
Remember Me:&nbsp;
<?php
if(isset($_COOKIE['remember'])) {
    echo "<input type=\"checkbox\" id=\"remember\" name=\"remember\" checked=\"checked\">";
} else {
    echo "<input type=\"checkbox\" id=\"remember\" name=\"remember\">";
}
?>
<input type="submit" id="submit" name="submit" value="Log In">
</form>
</body>
</html>

登录

您的代码明确指出应该发生这种情况。在第一次请求之后,
memory
POST参数将不再设置,因此if语句的计算结果为
true
。然后它将删除第一个cookie。下次它会删除第二个,因为第一个已经不存在了

也许你应该替换这一行:

elseif (!$_POST['remember']) {
为此:

elseif (!$_POST['remember'] && !$_COOKIE['remember']) {
您应该去掉其中的
elseif
s,因为您可能想要删除所有cookie。只要把
放在if
上,它就可以按你的意愿运行了


还有一个旁注:
$var
不是检查是否设置了值的正确方法。使用
!而是设置($var)

这个cookie问题与mysql和PDO有什么关系?因为它包含mysql和PDO代码,所以我所有的其他类都与此相关,所以我猜如果我接触到更多的人,那么我会得到一个与我希望实现的目标相关的更量身定制的答案。你的意思是这样吗
elseif(!isset($\u POST['memore'])&(!isset($\u COOKIE['memore']))
Yes…如果您根据变量的存在做出决定。如果值也很重要,您可以安全地添加
$_用另一个
&&
将['memory']
发布到条件中。只需确保在实际使用变量之前始终检查
isset()
。谢谢,太好了:)