在我的本地/开发环境中,MySQL查询执行正常。但是,当我在我的Web主机环境中上传它时,我收到此错误:
致命错误:在...中的非对象上调用成员函数bind_param()
这是代码:
global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc); 为了检查我的查询,我试图通过控制面板phpMyAdmin执行查询,结果是OK。
有时您的查询失败,您不知道原因。因此,配置PHP和mysqli以报告每个错误非常重要。
如何在mysqli中获取错误消息 首先,MySQLi在所有环境中连接之前总是有这条线:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 之后,所有MySQL错误都将转移到PHP异常中。反过来,未捕获的异常会导致PHP致命错误。因此,如果出现MySQL错误,您将收到传统的PHP错误。这将立即让您意识到错误原因。堆栈跟踪将引导您到达发生错误的确切位置。
如何在不同的环境中配置PHP 以下是我关于PHP错误报告的文章的要点: 请注意,您必须能够查看PHP错误。这确实是不同环境的问题:
您必须将相应的配置选项设置为以下值
在开发服务器上
error_reporting应该设置为E_ALL值; display_errors 应设为1 在生产服务器上
error_reporting应该设置为E_ALL值; display_errors 应设为0 log_errors 应设为1 如何实际使用它? 只是删除了错误手动检查任何代码,所有这些or die(),if ($result)和这样的。只需立即编写数据库交互代码即可
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)"); $stmt->bind_param("si", $name, $quantity); $stmt->execute(); 再一次,没有任何条件。如果发生错误,则会将其视为代码中的任何其他错误。例如,在开发PC上,它只会出现在屏幕上。对于实时网站,您将需要一个错误包装,但这是一个不同的故事,与mysqli及其错误完全无关。
如何处理您收到的错误消息 收到错误消息后,您必须阅读并理解它。这听起来太明显了,但学习者经常忽略错误信息的极端有用性。但大多数时候它解释这个问题非常简单。比如,如果它说特定表不存在,则必须检查拼写,拼写错误,字母大小写,凭证等。或者,如果它说SQL语法中存在错误,那么您必须检查SQL。问题点就在错误消息中引用的查询部分之前。
您还必须信任该错误消息。如果它说令牌的数量与绑定变量的数量不匹配那么它就是这样。缺席的表或列也是如此。鉴于选择,无论是你自己的错误还是错误信息是错误的,总是坚持前者。它再次听起来居高临下,但在这个网站上的数百个问题证明这个建议非常有用。
在错误报告方面您不应该做的事情列表 使用错误抑制运算符(@) 使用die()或echo或任何其他功能无条件地在屏幕上打印错误消息。PHP可以很好地回应它,不需要任何帮助。 手动测试查询结果(如if($result))只是没有意义。您的查询失败并且您已经获得了错误异常,或者它没有问题,也没有什么可以测试的。 使用try..catch回显错误消息。PHP可以做得更好,更好。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。