TL;DR
- 始终在您的mysqli连接代码中,并始终检查PHP错误。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
- 始终将 SQL 查询中的每个 PHP 变量替换为问号,并使用预准备语句执行查询。这将有助于避免各种语法错误。
解释
有时,您的 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连接之前,始终有这条线:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
之后,所有MySQL错误都将转移到PHP异常中。反过来,未捕获的异常会造成 PHP 致命错误。因此,如果发生MySQL错误,您将获得传统的PHP错误。这将立即使您意识到错误原因。堆栈跟踪将引导您到发生错误的确切位置。
如何从 PHP 获取错误消息
以下是我关于PHP错误报告的文章的要点:在开发和实时服务器上报告错误必须不同。在开发服务器上,在屏幕上显示错误很方便,但在实时服务器上,必须改为记录错误消息,以便以后可以在错误日志中找到它们。
因此,必须将相应的配置选项设置为以下值:
-
在开发服务器上
-
error_reporting
应设置为值;E_ALL
-
log_errors
应设置为 1(在开发 PC 上也方便地拥有日志)
-
display_errors
应设置为 1
-
在生产服务器上
-
error_reporting
应设置为值;E_ALL
-
log_errors
应设置为 1
-
display_errors
应设置为 0
之后,当MySQL查询失败时,您将收到一个PHP错误,解释原因。在实时服务器上,为了获取错误消息,您必须检查错误日志。
如何实际使用它
只需删除任何手动检查错误的代码,所有这些,等等。只需立即编写数据库交互代码:or die()
if ($result)
try..catch
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
再次,周围没有任何条件。如果发生错误,它将被视为代码中的任何其他错误。例如,在开发PC上,它只会出现在屏幕上,而在实时站点上,它将为程序员记录,而为了方便用户,您可以使用错误处理程序(但这是一个不同的故事,这与MySQLi的主题无关,但您可以在上面链接的文章中阅读有关它的信息)。
如何处理您收到的错误消息
首先,您必须找到问题查询。错误消息包含发生错误的确切位置的文件名和行号。对于简单代码,这就足够了,但是如果您的代码使用函数或类,则可能需要遵循堆栈跟踪来查找问题查询。
收到错误消息后,您必须阅读并理解它。这听起来太明显了,如果不是居高临下,但学习者经常忽略了一个事实,即错误消息不仅仅是一个警报信号,但它实际上包含了对问题的详细解释。您所需要的只是阅读错误消息并解决问题。
- 比如说,如果它说一个特定的表不存在,你必须检查拼写、拼写错误和字母大小写。此外,您必须确保PHP脚本连接到正确的数据库
- 或者,如果它说SQL语法中存在错误,那么您必须检查您的SQL。问题点就在错误消息中引用的查询部分之前。
如果您不理解错误消息,请尝试谷歌它。在浏览结果时,坚持使用解释错误的答案,而不是直言不讳地给出解决方案。解决方案可能不适用于您的特定情况,但该说明将帮助您了解问题并使您能够自己解决问题。
您还必须信任错误消息。如果它说令牌的数量与绑定变量的数量不匹配,那么它就是如此。对于缺少的表或列也是如此。如果可以选择,无论是你自己的错误还是错误消息是错误的,都要坚持前者。这听起来很居高临下,但这个网站上的数百个问题证明这个建议非常有用。
在错误报告方面,您永远不应该做的事情的列表
- 切勿使用错误抑制运算符 ()!它使程序员无法阅读错误消息,因此无法修复错误
@
- 请勿使用 或 或任何其他功能无条件地在屏幕上打印错误消息。PHP可以自己报告错误,并且根据环境以正确的方式进行操作 - 所以只需将其留给PHP即可。
die()
echo
- 不要添加条件来手动测试查询结果(如 )。启用错误异常后,这种情况将毫无用处。
if($result)
- 不要使用运算符来回显错误消息。应使用此运算符执行某些错误处理,如事务回滚。但永远不要仅仅用它来报告错误 - 正如我们上面学到的,PHP已经可以做到这一点,正确的方式。
try..catch
附言:
有时没有错误,但也没有结果。然后,这意味着数据库中没有与您的条件匹配的数据。在这种情况下,你必须承认这个事实,即使你可以发誓数据和标准都是正确的。事实并非如此。您必须再次检查它们。
我有一篇文章可以帮助解决这个问题,如何调试数据库交互。虽然它是为PDO编写的,但原理是相同的。只需按照这些说明逐步操作,然后解决问题或为堆栈溢出提供可回答的问题。