这个问题以前肯定出现过,但我还没有找到解决方案。我正在尝试从数据库中选择用户名和密码来验证用户一个简单的登录脚本。它应该简单地在用户表中找到一行,其中的用户名和密码与通过登录表单提交的用户名和密码相匹配。
我可以毫无问题地匹配用户名,但不能匹配密码,我不知道为什么。
该表包含名为“用户名”和“密码”的列,表中只有 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
周围放置 刻度线
。像这样:
$statement = $db->prepare('SELECT * FROM users WHERE `password` = :parameter');
$statement->bindValue(':parameter', $pw);
请注意,这些是刻度标记
,而不是单引号。它们位于 ~ 所在的同一键上,位于 Tab 键上方。这些 刻度线
将指示 password
是一个列名。
关于PHP MySQL : issue selecting different columns from the same table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22386508/