php
  • mysql
  • 2010-01-10 48 views 0 likes 
    0

    最后我有这个功能可以工作。它做到了它的工作,但它看起来很混乱,只是想听听你的想法,也许他们的东西我可以改进?我的“记住我” - 特色

    非常感谢!

    登录

    $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"); 
    } 
    
    } 
    
    +0

    你的问题是什么? – danben 2010-01-10 15:09:48

    +0

    总有几种方法可以做事。你的方法对于一个小型非要求苛刻的应用程序是可以的。我可能会使用OOP方法,并将关注点和角色划分为认证服务,数据库适配器和用户实体等等。尽管如此,还是有更多的代码。 – Gordon 2010-01-10 15:35:12

    回答

    0

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

    +0

    会话控制,是:Sven已经使用的$ _SESSION变量。但会话数据仅存储在一个浏览器会话中,即使在会话结束后,Sven也希望用户保持登录状态。 – 2010-01-10 15:03:08

    +2

    按会话我的意思是更广泛的意义,即用户会话,而不是浏览器会话。 – 2010-01-10 15:05:13

    +0

    啊好的。 PHP没有内置的用户会话管理解决方案afaik。 – 2010-01-10 15:14:21

    2

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

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

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

    $row->id; 
    

    另外,如果您id列不是卫生(如:用户输入一些数据,它在一些点),你会想要在你的UPDATE查询中转义它。

    只是在这一个偏好的问题,但是当我检查URL参数存在时,我喜欢使用!empty()而不是isset。其原因是,如果该参数设置,但空的,它仍然会返回false:

    !empty($_POST['remember']) 
    

    而且关于这一点,一定要消毒​​。 Cookie值可以由用户更改。

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

    最后,它可能是一个好主意,不要选择在查询*,因为这可以在应用以后碰到您对性能墙壁。考虑只选择用户的ID:

    mysql_query("SELECT id FROM users ... 
    

    其他一切看起来都不错!

    相关问题