2014-03-13 144 views
0

這肯定是之前發佈的,但我還沒有找到解決方案。我試圖從數據庫中選擇用戶名和密碼來驗證用戶是否有簡單的登錄腳本。它應該簡單地在用戶表中找到一行,用戶名和密碼與通過登錄表單提交的用戶名和密碼相匹配。PHP MySQL:從同一個表中選擇不同列的問題

我可以匹配用戶名沒有任何問題,但沒有密碼,我不知道爲什麼。

該表包含稱爲「用戶名」和「密碼」的列,表中只有1行用戶名'admin'和密碼'testpassword'。

這裏是包含三個選項的功能 - 選項1和4工作,其他兩個不工作。選項2與選項1相同,除了查找不同的列。我已檢查查詢中的列名與表中的列匹配,並且提交的值匹配。我沒有收到任何錯誤信息,也看不到可能有什麼錯誤(基本的東西,我敢肯定...)。

function new_session ($username, $pw, $inactive) { 

    // echo statements verify that variable match database values 
    echo "<h2>username = " . $username . "</h2>"; 
    echo "<h2>password = " . $pw . "</h2>"; 
    echo "<h2>inactive = " . $inactive . "</h2>"; 

    $db = mydb::getConnection(); 

    //option 1 
    $statement = $db->prepare('SELECT * FROM users WHERE username = :parameter'); 
    $statement->bindValue(':parameter', $username); 

    //option 2 
    //$statement = $db->prepare('SELECT * FROM users WHERE password = :parameter'); 
    //$statement->bindValue(':parameter', $pw); 

    //option 3 
    //$statement = $db->prepare('SELECT * FROM users WHERE password = :parameter1 AND username = :parameter2'); 
    //$statement->bindValue(':parameter1', $username); 
    //$statement->bindValue(':parameter2', $pw); 

    //option 4 
    //$statement = $db->prepare('SELECT * FROM users WHERE username = "admin" AND password = "testpassword"'); 

    $statement->execute(); 
    $row = $statement->fetchAll(); 

    if (count($row) == 1) { 
     // SESSION data is set here for options 1 and 4 
    } 
} 
+0

密碼是否以加密形式存儲?嘗試排查查詢時出現 – larsAnders

+0

。我嘗試以純文本形式編寫查詢並運行它。如果我不能得到這樣的結果,那麼我需要編輯我的基本查詢,然後嘗試以代碼形式編輯 – hamobi

+0

選項3的參數順序錯誤。參數1應該是pw,參數2應該是用戶名。這應該工作正常 – Ronnie

回答

2

您需要檢查的第一件事是數據庫中的密碼是否被散列。他們可能是應該的,如果他們是你需要使用散列函數來比較現在PASSWORD

$statement = $db->prepare('SELECT * FROM users WHERE password = PASSWORD(:parameter)'); 
$statement->bindValue(':parameter', $pw); 

,如果你的密碼不會被散列(可恥的是你),你可能有一個不同的問題。正如你在上面看到的,password是mysql中的一個函數名。由於您正在使用password作爲列名,因此解析語句可能會出現問題。在列名password周圍放置tick-marks。像這樣:

$statement = $db->prepare('SELECT * FROM users WHERE `password` = :parameter'); 
$statement->bindValue(':parameter', $pw); 

注意那些是tick marks,不是單引號。它們位於標籤鍵上方的所在的鍵上。這些tick marks將指示password是列名稱。

2

「PASSWORD」一詞是一個mysql命令。所以先這樣逃脫它:

//option 3 
    //$statement = $db->prepare('SELECT * FROM users WHERE `password` = :parameter1 AND username = :parameter2') 

如果此查詢給出錯誤,那麼我認爲你有你的密碼編碼。 然後用這個MD5:

$statement->bindValue(':parameter', md5($pw)); 

使用SHA1算法:

$statement->bindValue(':parameter', sha1($pw)); 

我看不出有什麼其他錯誤,這可能會導致沒有行:○

1

感謝所有的建議,並採取時間來看看這個,我已經逃過了密碼這個字眼,但我很慚愧地說,問題是我的密碼錶單輸入的最大長度是修剪最後一個字符,我沒有發現它。

+1

不要擔心隊友。至少你現在會知道這件事。你可以預防下一次發生。這就是我們都學習的方式! – Beardminator

相關問題