作为 PHP Web 应用程序的一部分,我正在使用 mysqli 和准备好的语句查询 MySQL 数据库。
我在几个查询中使用了完全相同的代码并且它有效,但在一个特定的查询中,它总是返回一个空记录集。我从 MySQL 命令行运行了完全相同的查询,它正确地返回了结果。我检查了传入的参数,没有问题。
我花了一天中最好的时间来弄清楚为什么我总是得到一个没有错误或警告的空记录集。我已将 PHP 的错误设置为显示在页面上,并将它们设置为 E_ALL|E_STRICT。我仍然没有收到任何警告或错误。
我已经尝试了所有显而易见的事情,例如确保我可以实际连接到数据库、检查传入的参数以及确保我尝试返回的行确实存在于数据库中。我在整个页面上都有 var_dump() 和 die() 来检查返回的内容,它始终是一个合法但空的记录集。
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);
}
}
欢迎任何反馈。我确定我错过了一些简单的东西,但如果我不剃光头,我现在就会把头发扯掉。
谢谢
最佳答案
我不熟悉 mysqli 库(我通常使用提供非常相似的跨平台 API 的 PDO)所以我不能立即看出任何问题。但是,您可以尝试查看 mysqld 日志。有关信息,请参见此处:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
通过跟踪日志,您应该能够看到提交的确切查询。
最后一点,我注意到您使用的是固定盐值。每次需要的时候随机生成这个值,然后存到users表里不是更好吗?通常,盐并不是为了保密,它只是为了防止人们使用您使用的哈希算法预先计算密码表。
关于php - mysqli 从不返回任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5674751/