开发者社区> 问答> 正文

如何在不同环境中获取MySQL错误信息?

在我的本地/开发环境中,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。

展开
收起
游客6qcs5bpxssri2 2019-08-28 21:25:30 854 0
1 条回答
写回答
取消 提交回答
  • 推荐回答

    有时您的查询失败,您不知道原因。因此,配置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可以做得更好,更好。

    2019-08-28 21:26:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像