为了账号安全,请及时绑定邮箱和手机立即绑定

mysqli_fetch_assoc()期望参数1为mysqli_result或如何获取MySQLi

mysqli_fetch_assoc()期望参数1为mysqli_result或如何获取MySQLi

www说 2019-05-20 16:17:40
在我的本地/开发环境中,MySQLi查询执行正常。但是,当我在我的Web主机环境中上传它时,我收到此错误:这是代码: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。
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

有时您的查询失败,您不知道原因。因此,配置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();

再次,witohut周围的任何条件。如果发生错误,则会将其视为代码中的任何其他错误。例如,在开发PC上,它只会出现在屏幕上。对于实时网站,您将需要一个错误包装,但这是一个不同的故事,与mysqli及其错误完全无关。

如何处理您收到的错误消息

收到错误消息后,您必须阅读并理解它。这听起来太明显了,但学习者经常忽略错误信息的极端有用性。但大多数时候它解释这个问题非常简单。比如,如果它说特定表不存在,则必须检查拼写,拼写错误,字母大小写,凭证等。或者,如果它说SQL语法中存在错误,那么您必须检查SQL。问题点就在错误消息中引用的查询部分之前。

您还必须信任该错误消息。如果它说令牌的数量与绑定变量的数量不匹配那么它就是这样。缺席的表或列也是如此。鉴于选择,无论是你自己的错误还是错误信息是错误的,总是坚持前者。它再次听起来居高临下,但在这个网站上的数百个问题证明这个建议非常有用。

关于错误报告的不应该做的清单

  • 使用错误抑制运算符(@

  • 使用die()echo或任何其他功能无条件地在屏幕上打印错误消息。PHP可以很好地回应它,不需要任何帮助。

  • 手动测试查询结果(如if($result))只是没有意义。您的查询失败并且您已经获得了错误异常,或者它没有问题,也没有什么可以测试的。

  • 使用try..catch回显错误消息。PHP可以做得更好,更好。


查看完整回答
反对 回复 2019-05-20
  • 1 回答
  • 0 关注
  • 1417 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信