我的“记住我” - 特征

时间:2010-01-10 14:30:33

标签: php mysql

最后我有了这个功能。它完成它的工作,但它看起来非常混乱,只是想听听你的想法,也许他们可以改进他们的想法?

非常感谢!

登录

$result = mysql_query("SELECT * FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
$row = mysql_fetch_object($result);

    if (mysql_num_rows($result) == 0) {
        exit('Bad Login');
    }

    $_SESSION['id'] = mysql_result($result, 0, 'id');

    # The user wants to be remembered
    if (isset($_POST['remember'])) {
        $key = md5(uniqid());
        setcookie('remember', $key, time()+900000);  /* expire in 10 days */
        mysql_query("UPDATE users SET sessionkey = '$key' WHERE id = ".mysql_result($result, 0, 'id'));

    }

在每一页上我都会检查:

if (isset($_SESSION['id'])) {
header("Location: welcome.php");
}

elseif (isset($_COOKIE['remember'])) {

$rs = mysql_query("SELECT * FROM users WHERE sessionkey = '$_COOKIE[remember]'");

if (mysql_num_rows($rs) == 1) {
    $_SESSION['id'] = 1;
header("Location: welcome.php");
}

}

2 个答案:

答案 0 :(得分:2)

mysql_fetch_object($result)语句之前放置检查行数是否为零的代码。这样,如果用户不存在,您不会浪费额外的CPU周期。

改变这个(在两个地方):

mysql_result($result, 0, 'id');

$row->id;

此外,如果您的id列不符合要求(即:用户已在某个时间点输入了某些数据),您可能希望在UPDATE查询中将其转义

只是对此问题的偏好,但当我检查网址参数存在时,我喜欢使用!empty()而不是isset。原因是如果参数设置但为空,它仍将返回false:

!empty($_POST['remember'])

另外,请务必清理$_COOKIE['remember']。 Cookie值可以由用户更改。

mysql_query("SELECT * FROM users WHERE sessionkey = '" . mysql_real_escape_string($_COOKIE[remember]) . "'");

最后,最好不要在查询中选择*,因为这可能会让您在应用中遇到性能问题。考虑只选择用户的ID:

mysql_query("SELECT id FROM users ...

其他一切看起来都不错!

答案 1 :(得分:0)

我不是PHP专家,但可能有一个现成的会话管理解决方案 - 我建议你自己动手使用它。