任何时候你得到…
“警告:mysqli_fetch_object()期望参数1为mysqli_result,布尔给定”
…这很可能是因为您的查询有问题。prepare()或query()可能返回FALSE(一个布尔值),但是这个通用的失败消息不会给您留下太多线索。您如何发现您的查询有什么问题?你问!
首先,确保错误报告已打开并且可见:将这两行添加到文件的顶部,就在<?php标签:
error_reporting(E_ALL);
ini_set('display_errors', 1);
If your error reporting has been set in the php.ini you won't have to worry about this. Just make sure you handle errors gracefully and never reveal the true cause of any issues to your users. Revealing the true cause to the public can be a gold engraved invitation for those wanting to harm your sites and servers. If you do not want to send errors to the browser you can always monitor your web server error logs. Log locations will vary from server to server e.g., on Ubuntu the error log is typically located at /var/log/apache2/error.log. If you're examining error logs in a Linux environment you can use tail -f /path/to/log in a console window to see errors as they occur in real-time....or as you make them.
一旦您掌握了标准错误报告,在数据库连接和查询上添加错误检查将为您提供有关正在发生的问题的更多详细信息。看看这个列名不正确的例子。首先,返回通用致命错误消息的代码:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
这个错误是一般的,对您解决正在发生的问题没有多大帮助。
再写几行代码,就可以得到非常详细的信息,可以立即用来解决问题。检查prepare()语句的真实性,如果它是好的,你可以继续绑定和执行。
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
如果出现问题,你可以发出一条错误消息,直接找到问题所在。在这种情况下,表中没有foo列,解决问题是微不足道的。
如果您愿意,可以将这种检查包含在函数或类中,并像前面提到的那样通过优雅地处理错误来扩展它。