TL;DR
- 一直有
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
在你的 mysqli 连接代码中并始终检查 PHP 错误.
- 始终用问号替换 SQL 查询中的每个 PHP 变量,并使用以下命令执行查询准备好的声明 https://phpdelusions.net/mysqli_examples/prepared_select。它将有助于避免各种语法错误。
解释
有时你的 mysqli 代码会产生如下错误mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given...
, Call to a member function bind_param()...
或类似的。或者即使没有任何错误,但查询仍然无法正常工作。这意味着您的查询无法执行。
每次查询失败时,MySQL都会解释原因的错误消息。在旧的 PHP 版本中,此类错误不会转移到 PHP,您得到的只是上面提到的一条神秘的错误消息。因此,配置 PHP 和 mysqli 向您报告 MySQL 错误非常重要。一旦收到错误消息,您就能够修复该错误。
如何获取mysqli中的错误信息
首先,在 mysqli 连接之前始终有这一行all您的环境:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
之后,所有 MySQL 错误都将转为 PHP 异常。未捕获的异常又会导致 PHP 致命错误。因此,如果出现 MySQL 错误,您将收到传统的 PHP 错误。这将立即让您意识到错误原因。堆栈跟踪将引导您找到发生错误的确切位置。
如何从 PHP 获取错误消息
在开发服务器上,确保屏幕上显示错误,而在实时服务器上,请检查错误日志。请参阅我的文章PHP错误报告 https://phpdelusions.net/basic_principles_of_web_programming#error_reporting了解详情。
请注意,如果是 AJAX 调用,请在开发服务器上打开 DevTools (F12),然后打开“网络”选项卡。然后发起您想要看到的结果的请求,它将出现在“网络”选项卡中。单击它,然后单击“响应”选项卡。在那里您将看到确切的输出。在实时服务器上检查错误日志。
如何处理收到的错误消息
首先,您必须找到问题查询。错误信息包含文件名和行号发生错误的确切位置。对于简单的代码来说就足够了,但是如果您的代码使用函数或类,您可能需要遵循堆栈跟踪来定位问题查询。
收到错误消息后,您必须阅读并理解它。这听起来太明显了,如果不是居高临下的话,但学习者常常忽视这样一个事实:错误消息不仅仅是一个警报信号,它实际上包含了一个错误信息。问题的详细解释。您所需要做的就是阅读错误消息并解决问题。
- 比如说,如果它说某个特定的表不存在,您必须检查拼写、拼写错误和字母大小写。此外,您还必须确保您的 PHP 脚本连接到正确的数据库
- 或者,如果它说 SQL 语法有错误,那么你必须检查你的 SQL。而且问题点是对的before错误消息中引用的查询部分。
如果您不明白错误消息,请尝试用 google 搜索。浏览结果时,请坚持以下答案explain错误而不是直接给出解决方案。解决方案可能不适用于您的特定情况,但解释将帮助您理解问题并使您能够自己解决问题。
你也必须trust错误消息。如果它说标记的数量与绑定变量的数量不匹配,那么它is所以。对于缺失的表或列也是如此。如果有选择,无论是你自己的错误还是错误消息是错误的,请始终坚持前者。这听起来又有点居高临下,但这个网站上的数百个问题证明这个建议非常有用。
基本调试
如果您的查询似乎不起作用,可能是由以下四个原因引起的:
- 执行过程中出现错误。上面已经解释过了。
- 由于程序逻辑不正确,SQL 根本没有运行。添加临时调试输出以确保代码到达查询执行的位置。
- SQL执行成功,但结果在错误的数据库 https://stackoverflow.com/a/60666640/285587。仔细检查一下
- 输入数据与数据库不匹配。这里有一些建议如何检查 https://stackoverflow.com/a/57986043/285587