【问题标题】:PHP MySQL: issue selecting different columns from the same tablePHP MySQL:从同一个表中选择不同列的问题
【发布时间】:2014-04-18 15:39:59
【问题描述】:

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

我可以毫无问题地匹配用户名,但不能匹配密码,我不知道为什么。

该表包含名为“用户名”和“密码”的列,表中只有 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
    } 
}

【问题讨论】:

  • 密码是否以加密形式存储?
  • 尝试对查询进行故障排除时。我尝试以纯文本形式编写查询并运行它。如果我不能得到这样的结果,那么我需要在尝试以代码形式编辑之前编辑我的基本查询
  • 选项 3 的参数顺序错误。参数 1 应该是 pw,参数 2 应该是用户名。那应该可以正常工作

标签: php mysql select pdo


【解决方案1】:

单词“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】:

    感谢所有的建议和花时间来看看这个,我已经按照建议转义了密码这个词但是我很惭愧地说问题是我的密码表单输入中的 maxlength 正在修剪最后一个字符而我没有没发现。

    【讨论】:

    • 别担心,伙计。至少你现在会知道这一点。并且您可以防止下次发生。这就是我们所有人的学习方式!
    【解决方案3】:

    您需要检查的第一件事是您的数据库中的密码是否经过哈希处理。他们可能应该是,如果他们是你需要使用散列函数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,而不是单引号。它们位于与 ~ 相同的键上,位于制表键上方。这些tick marks 将表明password 是一个列名。

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 2022-11-01
      • 2023-04-08
      • 2017-01-26
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      相关资源
      最近更新 更多