mysqli_fetch_assoc()需要参数/调用成员函数bind_param()时出错如何获得实际的mysql错误并修复它?

8fq7wneg  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(337)

在我的本地/开发环境中,mysqli查询运行正常。但是,当我将其上载到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执行查询,结果是正常的。

mutmk8jj

mutmk8jj1#

有时mysqli代码会产生如下错误 mysqli_fetch_assoc() expects parameter... , Call to a member function bind_param()... 或者类似的。或者即使没有任何错误,但查询的工作方式也不尽相同。这意味着您的查询无法执行。
每次查询失败时,mysql都会有一条解释原因的错误消息。不幸的是,默认情况下,这些错误不会传输到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

如何实际使用它?

只需删除任何手动检查错误的代码,所有这些 or die() , if ($result) 诸如此类。只需立即编写数据库交互代码:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

同样,没有任何条件。如果发生错误,它将被视为代码中的任何其他错误。例如,在一台开发pc上,它只会出现在屏幕上,而在一个实时站点上,它会被程序员记录下来,而为了方便用户,你可以使用一个错误处理程序(但对于mysqli来说,这是另一个不同的故事,但你可以在上面链接的文章中看到)。

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

首先,您必须找到问题查询。错误消息包含发生错误的确切位置的文件名和行号。对于简单的代码来说,这就足够了,但是如果您的代码使用的是函数或类,那么您可能需要按照堆栈跟踪来定位问题查询。
收到错误信息后,你必须阅读并理解它。这听起来太明显了,如果不居高临下,但学习者往往忽略了一个事实,即错误信息不仅仅是一个报警信号,它实际上包含了对问题的详细解释。你所需要的就是阅读错误信息并解决问题。
比如说,如果它说某个特定的表不存在,你就必须检查拼写、打字错误、字母大小写。您还必须确保您的php脚本连接到正确的数据库
或者,如果它说sql语法有错误,那么您必须检查您的sql。问题点就在错误消息中引用的查询部分之前。
如果你不明白错误信息,试着用谷歌搜索一下。在浏览结果时,坚持解释错误的答案,而不是直截了当地给出解决方案。解决方案可能不适用于您的特定情况,但解释将帮助您了解问题并使您能够自行解决问题。
您还必须信任错误消息。如果它说令牌的数量与绑定变量的数量不匹配,那么就是这样。缺少的表或列也是如此。如果有选择,无论是你自己的错误还是错误信息是错误的,都要坚持前者。同样,这听起来是居高临下的,但在这个网站上的数百个问题证明这个建议非常有用。

关于错误报告你永远不应该做的事情清单

切勿使用错误抑制运算符( @ )! 它使程序员无法读取错误消息,因此无法修复错误
不要使用 die() 或者 echo 或任何其他功能无条件地在屏幕上打印错误消息。php可以自己报告错误,并根据环境的不同以正确的方式进行报告—所以只需将其留给php即可。
不要添加条件来手动测试查询结果(如 if($result) ). 如果启用了错误例外,那么这种情况将毫无用处。
不要使用 try..catch 用于回显错误消息的运算符。这个操作符应该用来执行一些错误处理,比如事务回滚。但是千万不要仅仅用它来报告错误——正如我们在上面学到的,php已经可以用正确的方法来做了。
附笔
有时没有错误,但也没有结果。这意味着,数据库中没有符合您的条件的数据。在这种情况下,你必须承认这个事实,即使你可以发誓数据和标准都是正确的。他们不是。你得再检查一遍。我有一篇文章可以帮助解决这个问题,如何调试数据库交互。虽然是为pdo写的,但原理是一样的。只要一步一步地遵循这个指令,要么解决您的问题,要么对堆栈溢出有一个可回答的问题。

相关问题