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

Php mysqli_fetch_assoc()需要参数/调用成员函数bind_param()时出错。如何获取实际的mysql错误并修复它?,php,mysqli,prepared-statement,environment,error-reporting,Php,Mysqli,Prepared Statement,Environment,Error Reporting,在我的本地/开发环境中,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); $st

在我的本地/开发环境中,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执行查询,结果正常。

有时您的MySQLi代码会产生一个错误,如
MySQLi_fetch_assoc()期望参数…
调用成员函数bind_param()…
或类似错误。或者即使没有任何错误,但查询也不能完全正常工作。这意味着您的查询无法执行

每次查询失败时,MySQL都会显示一条解释原因的错误消息。不幸的是,默认情况下,这些错误不会传输到PHP,您所得到的只是上面提到的一条神秘的错误消息。因此,配置PHP和MySQLi向您报告MySQL错误是非常重要的。一旦您收到错误消息,修复它将是小菜一碟

如何在MySQLi中获取错误消息? 首先,在MySQLi连接到all您的环境之前,请始终使用此线路:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
之后,所有MySQL错误都将被转移到PHP异常中。未捕获的异常反过来会导致PHP致命错误。因此,在MySQL错误的情况下,您将得到一个常规的PHP错误。这将立即让您知道错误原因。堆栈跟踪将引导您找到错误发生的确切位置

如何在不同的环境中配置PHP 以下是我这篇文章的要点:
在开发服务器和实时服务器上报告错误必须不同。在开发服务器上,可以方便地在屏幕上显示错误,但在实时服务器上,必须记录错误消息,以便以后可以在错误日志中找到它们

因此,必须将相应的配置选项设置为以下值:

  • 在开发服务器上

    • error\u reporting
      应设置为
      E\u ALL
    • log\u errors
      应设置为1(在开发PC上也有日志很方便)
    • 显示错误
      应设置为1
  • 在生产服务器上

    • error\u reporting
      应设置为
      E\u ALL
    • log\u errors
      应设置为1
    • 显示错误
      应设置为0
如何实际使用它? 只需删除手动检查错误的所有代码,所有那些
或die()
如果($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
    运算符回显错误消息。应该使用此运算符执行一些错误处理,如事务回滚。但千万不要仅仅用它来报告错误