PHP MySQL:问题从同一个表中选择不同的列

时间:2014-03-13 17:35:40

标签: php mysql select pdo

这肯定会出现,但我还没有找到解决方案。我试图从数据库中选择用户名和密码来验证用户一个简单的登录脚本。它应该只是在users表中找到一行,其用户名和密码与通过登录表单提交的用户名和密码相匹配。

我可以匹配用户名,没有任何问题,但没有密码,我不知道为什么。

该表包含名为" username"和#34;密码"并且表格中只有一行带有用户名' 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
    } 
}

3 个答案:

答案 0 :(得分:2)

首先需要检查的是数据库中的密码是否经过哈希处理。它们可能应该是,如果它们是你需要使用散列函数PASSWORD

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

现在,如果你的密码没有哈希(对你很羞耻),你可能会遇到其他问题。正如您在上面所看到的,password是mysql中的函数名。它可能在解析您的语句时遇到问题,因为您使用password作为列名。将tick-marks放在列名password周围。像这样:

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

请注意,这些是tick marks,而不是单引号。它们位于Tab键上方所在的相同键上。这些tick marks表示password是列名。

答案 1 :(得分: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));

我没有看到可能导致没有行的其他错误:o

答案 2 :(得分:1)

感谢所有的建议,并花时间看这个,我已经按照建议逃过了密码这个词然而我很惭愧地说问题是我的密码表格输入的maxlength是修剪最后一个字符和我没有发现它。