簡體   English   中英

PHP MySQL:在同一張表中選擇不同的列的問題

[英]PHP MySQL: issue selecting different columns from the same table

這肯定已經出現過,但是我還沒有找到解決方案。 我試圖從數據庫中選擇用戶名和密碼,以驗證用戶的簡單登錄腳本。 它只需在用戶表中找到一行,其用戶名和密碼與通過登錄表單提交的用戶名和密碼相匹配。

我可以毫無問題地匹配用戶名,但是密碼卻沒有問題,我也不知道為什么。

該表包含名為“用戶名”和“密碼”的列,並且表中只有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
    } 
}

您需要檢查的第一件事是數據庫中的密碼是否已哈希。 它們可能應該是,如果是,則需要使用哈希函數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 ,而不是單引號。 它們位於Tab鍵上方所在的同一鍵上。 這些tick marks表示password是列名。

單詞“ 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));

我沒有看到可能會導致沒有行的其他錯誤:o

感謝所有建議,並抽出寶貴時間研究此問題,我按照建議轉義了密碼一詞,但是我很as愧地說問題是密碼表輸入的最大長度正在修剪最后一個字符,而我沒有發現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM