php
  • mysql
  • 2010-01-10 50 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 ... 
    

    其他一切看起來都不錯!

    相關問題