2012-11-17 72 views
1

我有一個while循環遍歷從SQL查詢返回的行。該行中特定列的值存儲在一個數組中。然後迭代數組,並將每個元素與來自用戶的輸入進行比較。如果輸入匹配一個數組元素,那麼布爾變成true。我正在嘗試這樣做,以便用戶可以輸入密碼以訪問特定頁面。但它不起作用。我已經打印了數組中的所有值以及輸入,所以我知道那裏沒有問題。但由於某種原因,if語句並沒有對它們進行比較。代碼如下:爲什麼if語句在這個循環中不起作用? PHP

if (isset($_POST['ok'])) { 
    $password = $_POST['pass']; 
    $matched = false; 
    $pw = array(); 
    mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
    mysql_select_db("details")or die("Error"); 
    $query="SELECT * FROM members"; 
    $result=mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
    $pw[] = $row["pass"]; 
    } 
    foreach($pw as $p){ 
    if(strcmp($p, $password) == 0){ 
     $matched = true; 
    } 
    } 
    if ($matched==true) { 
    //Membership page 
    } else { 
    //Error message 
    } 
} else { 
    .... 
+1

試着改變你的循環中的foreach($ PW爲$ P){ 如果($ P == $密碼){$ 匹配= TRUE;打破; } } –

+5

不要忘記**不要**存儲簡單的密碼,使用**哈希算法**! – HamZa

+1

你有沒有想過大小寫敏感的問題? –

回答

0

找到一個匹配後需要休息一下,這樣$ matched纔會等於true。

if (isset($_POST['ok'])) { 

$password = $_POST['pass']; 
$matched = false; 
$pw = array(); 

mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
mysql_select_db("details")or die("Error"); 
$query="SELECT * FROM members"; 
$result=mysql_query($query); 

while ($row = mysql_fetch_assoc($result)){ 
$pw[] = $row["pass"]; 
} 

foreach($pw as $p){ 
    if(strcmp($p, $password) == 0){ 
    $matched = true; // found match so break out and do the membership. 
    break; 
} 
} 

    if ($matched==true) { 

     //Memebrship page 

    } else { 

     //Error message 
    } 

} else { 

.... 
+2

,它可以更快地執行腳本,但不會改變結果行爲中的任何內容,因爲他沒有'else {$ matched = false}塊在第二個(不必要的)循環 –

+0

Unfortunatley這不會做任何事情 – Matt9Atkins

1

這將是更加容易和高效的查詢更改爲類似這樣

$dbh = mysql_connect("localhost", "xxx", "xxx") or die("Error"); 
mysql_select_db("details", $dbh) or die("Error"); 

$pass = mysql_real_escape_string($_POST['pass'], $dbh); 
$user = mysql_real_escape_string($_POST['user'], $dbh); 

$sqlQuery = <<< EOQ 
    SELECT 
     * 
    FROM 
     `members` 
    WHERE 
     `user` COLLATE utf8_bin = '{$user}' COLLATE utf8_bin 
     AND 
     `password` COLLATE utf8_bin = '{$pass}' COLLATE utf8_bin 
EOQ; 

$result = mysql_query($sqlQuery); 
if ($result and (mysql_num_rows($result) === 1) { 
     echo "success"; 
     $userDetails = mysql_fetch_assoc($result); 
} else { 
     echo "username or password wrong"; 
} 

編輯:更新後的用戶名和密碼檢查是情況在任何情況下

EDIT2敏感:以上評論提醒不要存儲密碼明文。要更改爲散列密碼

UPDATE members SET pass = SHA1(pass); 

然後你的支票改爲

... AND pass = SHA1('{$pass}') 
+0

我不這樣做的原因是因爲我需要將列值存儲在一個數組中,因爲它們將在以後再次用於 – Matt9Atkins

+0

如果您需要所有用戶記錄稍後會將其取出。特別是在這種情況下,保持乾淨和簡單,並分開不屬於這裏的東西(單獨的認證和其他用戶數據處理) –

+0

我不明白爲什麼人們仍然使用過時的'mysql'模塊而不是'mysqli '模塊或PDO與預處理語句... – leemes

0

Sugestions:

1)更換直接MySQL的函數PDO調用:(這將不需要任何轉義,因爲PDO將處理一切)

$mysql_host = "localhost"; 
$mysql_user = "xxx"; 
$mysql_password = "xxx"; 
$mysql_database = "details"; 
$dbLink = new PDO("mysql:host=$mysql_host;dbname=$mysql_database;charset=utf8", $mysql_user, $mysql_password, array(PDO::ATTR_PERSISTENT => true)); 
$query = db()->prepare("select * from members WHERE pass = ? limit 1"); 
$query->execute(array($_POST['pass'])); 
$query->setFetchMode(PDO::FETCH_ASSOC); 
$myMember = $query->fetch(); 
$query->closeCursor(); 

2)如果你想堅持你的代碼,y您可以使用$pwd = mysql_real_escape_string($_POSt['pass'])作爲發佈的密碼,然後選擇包含轉義接收密碼$pwd的行。另外,別忘了mysql_free_result($result); !!!

3)做一個密碼的哈希值,因此你不需要使用mysql_real_escape_string。使用$pwHash = md5($_POST['pass'])$pwHash = sha1($_POST['pass'])或任何組合。

4)請對齊您的代碼。它將使人們更容易理解回答您的問題(提供幫助)以及將來的維護(您或其他人;相信我,您將在2-3年內忘記代碼)。

5)你的代碼應該工作,我不知道爲什麼它不。嘗試爲$pw添加var_dump,並在密碼匹配時在屏幕上寫入內容。也許你換了頁面(成員有錯誤)

+0

我爲$ pw添加了var_dump,並且我還爲輸入文本做了var_dump ....並且從中我可以看到該數組包含輸入字符串。所以我知道有一個匹配,它只是看起來不是做實際比較,然後將布爾值更改爲true – Matt9Atkins

+0

連接到數據庫時使用了什麼字符編碼?字符編碼可能會改變比較嗎? – ro0ter

+0

也嘗試在'for'循環內回顯您正在與'strcmp'比較的參數。看你在哪裏。你可以在你設置匹配爲真的地方添加一個echo來說服你自己,代碼運行良好 – ro0ter

0

爲什麼foreach循環?你可以這樣說:

if (isset($_POST['ok'])) { 
    $password = $_POST['pass']; 
    $matched = false; 
    $pw = array(); 
    mysql_connect("localhost", "xxx", "xxx")or die("Error"); 
    mysql_select_db("details")or die("Error"); 
    $query="SELECT * FROM members"; 
    $result=mysql_query($query); 
    while ($row = mysql_fetch_assoc($result)){ 
    $pw[] = $row["pass"]; 
    } 
    $pw_tmp = flip_array($pw); 

    if(isset($pw_tmp[$password])){ 
     //Membership page 
    }else{ 
     //Error message 
    } 
}else{ 
    // something else ... 
} 
相關問題