2012-04-22 36 views
1

我想創建一個簡單的登錄憑證檢查器(使用會話變量)。PHP檢查密碼腳本不會爲多個用戶工作

這是我到目前爲止有:

<?php 
include("dbconnect.php"); 
$u_name = mysql_real_escape_string($_POST['uname']); 
$p_word = mysql_real_escape_string($_POST['pword']); 
# *** querying all records *** 
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users"); 
while($rst = mysql_fetch_array($query)) { 

//echo $rst[valid_username] . ", "; 
//echo $u_name . " || "; 
//echo ($rst[valid_username] == $u_name) . " || "; 
//echo $rst[valid_password] . ", "; 
//echo $p_word . " || "; 
//echo ($rst[valid_password] == $p_word) . " || "; 
//echo (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)); 
//echo "<br/>"; 

if (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)) { 
    session_start(); 
    $_SESSION['login'] = "1"; 
    header('Location: main.php') ; 
} else { 
    session_start(); 
    $_SESSION['login'] = ''; 
    header('Location: badlogin.php') ; 
} 


} 

?> 

這裏的問題:如果MySQL表中有一個以上的用戶在它的列表中,檢查中斷。只有表中最後輸入的用戶已授予訪問權限。輸入的最後一位用戶之上的任何人都會被碰到不正確的登錄屏幕 - 即使憑據正確。爲什麼發生這種情況?任何人都可以提出一個代碼修復或更好的代碼來實現這個登錄檢查?

編輯:評論代碼測試以查看提供的憑據是否與記錄中的憑據相匹配。該腳本的那部分工作正常。

問題解決了!謝謝你們。對於將來看到這個的任何人,絕對要加密你的密碼,我的是純文本,因爲這是一個本地測試應用程序,甚至不會看到上傳到網絡。

+4

不要將密碼存放在純文本。 – SLaks 2012-04-22 02:42:52

+0

使用用戶名進行查詢。數據庫就是爲這種事情而精確優化的 - 使用它! – lynks 2012-04-22 02:45:23

回答

4

沒有必要遍歷所有的用戶記錄。試想一下,如果您的數據庫擁有1000000個用戶,則只需要嘗試獲取與提供的用戶名和密碼相對應的記錄。更新您的查詢是這樣的:

$query = mysql_query("SELECT * FROM notes_users 
         WHERE 
         valid_password = '$p_word' && 
         valid_username = '$u_name'"); 

,那麼你會做這樣的事情:

if (($row = mysql_fetch_array($query)) { 
    // valid user 
} else { 
    // invalid password or username 
} 
+1

從技術上說,他正在循環播放每一條記錄,除非他想要進行身份驗證的記錄是最後一條記錄,否則它會中斷。所以他要麼退出循環時,他想要在數據庫中認證的用戶名(壞主意)或具體與查詢(好主意)。 – Blake 2012-04-22 02:46:17

1

首先,以純文本的形式不存儲密碼!改爲使用md5/sha1散列。

其次,這不是獲取數據庫中所有用戶列表的好主意。您在SQL查詢中的WHERE子句 - 這也將解決您的問題。

+0

不要忘記鹽! – lynks 2012-04-22 02:48:14

+0

是的,感謝糾正我;) – 2012-04-22 03:12:28

0

您應該檢查特定用戶的登錄詳細信息。

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users WHERE valid_password = '$p_word' && valid_username = '$u_name' "); 

這將返回唯一一個要檢查的行。

0

爲什麼不直接查詢用戶的憑證?例如:

$statement = mysql_query("SELECT valid_username FROM notes_users WHERE \ 
valid_username = '{$u_name}' and valid_password = '{$p_word}' LIMIT 1;"); 

if (mysql_num_rows($statement) > 0) { /* log user in */ } 
else { /* bad log in */ 

哦,爲什麼你不使用===運算符進行字符串比較?看看它,它更實用。

0

這是糟糕的代碼,

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users"); 

使用下面的代碼:

$postedUsername=mysql_real_escape_string($_POST['uname'])); 
$postedPass=mysql_real_escape_string($_POST['pass'])); 
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users where username='$postedUsername' and password='$postedPass'"); 
+1

這是不好格式。 – Blake 2012-04-22 02:48:14

+0

請格式化代碼以便於理解 – 2012-04-22 02:51:04

+0

我是新手,在stackoverflow.Ok,對不起。我會改進它。 – 2012-04-22 02:59:29