编辑:我是新用户,所以我无法在24小时内回答我自己的问题。所以我在这里发布了答案。
感谢所有回答很快的人。
如果其他人遇到类似问题,如果你在mysqli_stmt对象上运行fetch(),真的会有帮助。
在上面的代码中,解决方案如下所示:
$query->bind_result($col1) or die ("Could not bind result");
$query->fetch(); // <--- How could I forget to do this?
if ($col1 !== 0) {
return true;
} else {
return false;
}
原始问题:
大家好,
作为PHP Web应用程序的一部分,我使用mysqli和预处理语句查询MySQL数据库。
我在一些查询中使用了完全相同的代码并且它可以工作,但在一个特定查询中,它总是返回一个空记录集。我从MySQL命令行运行完全相同的查询,它正确返回结果。我检查了传入的参数,它们没问题。
我花了一天的最佳时间试图找出为什么我总是得到一个没有错误或警告的空记录集。我已经将PHP的错误设置为显示在页面上,我将它们设置为E_ALL | E_STRICT。我仍然没有收到任何警告或错误。
我已经尝试了所有明显的事情,比如确保我可以实际连接到数据库,检查传入的参数,并确保我尝试返回的行实际上存在于数据库中。我在整个页面上都有var_dump()和die()s来检查返回的内容,它始终是一个合法但空的记录集。
function salt() {
return("I've removed my salt from this sample code");
}
function openDatabase() {
$conn = new mysqli("127.0.0.1", "username", "password", "database")
or die("Error: Could not connect to database.");
return($conn);
}
function checkUserCredentials($username, $password) {
$goodPassword = md5(salt().$username.$password);
$conn = openDatabase();
$query = $conn->stmt_init();
$query->prepare("SELECT id FROM users WHERE email = ? AND passwordHash = ?")
or die('Problem with query');
$query->bind_param("ss", $username, $goodPassword)
or die('Error binding parameters');
$query->execute() or die("Could not execute");
$query->bind_result($col1) or die ("Could not bind result");
if ($col1 !== 0) {
die("Authentication Complete");
} else {
die("Authentication Failure! Number of Rows: ".$query->num_rows." Username: " . $username . " Password Hash: " . $goodPassword);
}
}
感谢任何反馈。我确定我错过了一些简单的东西,但是如果我没有刮胡子,我现在就会把头发弄掉。
由于
答案 0 :(得分:0)
我不熟悉mysqli库(我通常使用提供非常类似的跨平台API的PDO),所以我不能立即看到任何问题。但是,您可能会尝试观看mysqld日志。有关信息,请参阅此处:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
通过拖尾日志,您应该能够看到提交的确切查询。
最后一点,我注意到你使用的是固定的盐值。每次需要时随机生成此值然后将其存储在users表中会不会更好?一般来说,盐并不是秘密,它只是用来阻止人们使用您使用的哈希算法预先计算密码表。
答案 1 :(得分:0)
万一其他人遇到类似问题,真的对您在mysqli_stmt对象上运行fetch()很有帮助。
在上面的代码中,解决方案如下:
$query->bind_result($col1) or die ("Could not bind result");
$query->fetch(); // <--- How could I forget to do this?
if ($col1 !== 0) {
return true;
} else {
return false;
}
代表OP添加了