在我的本地/开发环境中,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() expects parameter...
,Call to a member function bind_param()...
或类似的。甚至没有任何错误,但是查询不能完全一样。这意味着您的查询无法执行。
每次查询失败,MySQL都会显示 一条错误消息,说明原因
。不幸的是,默认情况下,此类错误不会转移到PHP,而您所得到的只是上面提到的一个神秘的错误消息。因此,配置PHP和MySQLi向您报告MySQL错误非常重要。一旦收到错误消息,对其进行修复将是小菜一碟。
首先,在 所有 环境中连接MySQLi之前,请始终保持以下状态:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
之后,所有MySQL错误都会转移到PHP异常中。反过来,未捕获的异常会导致PHP致命错误。因此,如果发生MySQL错误,您将获得常规的PHP错误。这将立即使您知道错误原因。堆栈跟踪将引导您到发生错误的确切位置。
这是我有关[PHP错误报告的]文章的要点:
开发和实时服务器上的[错误报告]必须不同。在开发服务器上,将错误显示在屏幕上很方便,但是在实时服务器上,必须记录错误消息,因此以后可以在错误日志中找到它们。
因此,必须将相应的配置选项设置为以下值:
在开发服务器上
error_reporting
应该设置为E_ALL
值;log_errors
应该设置为1(也可以在开发PC上登录日志)display_errors
应该设置为1 在生产服务器上
error_reporting
应该设置为E_ALL
值;
log_errors
应该设置为1display_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,但您可以在上面链接的文章中了解它。
首先,您必须找到问题查询。错误消息包含发生错误的确切位置 的文件名和行号 。对于足够的简单代码,但是如果您的代码使用的是函数或类,则可能需要遵循
堆栈跟踪 来定位问题查询。
得到错误消息后,您必须阅读并理解它。听起来虽然不屈服,但似乎太明显了,但是学习者经常忽略这样一个事实,即错误消息不仅是警报信号,而且实际上包含了
对该问题 的 详细说明 。您所需要做的就是阅读错误消息并解决问题。
如果您不明白该错误消息,请尝试使用它。在浏览结果时,请坚持使用能够 解释
错误的答案,而不是直截了当地给出解决方案。解决方案可能不适用于您的特定情况,但是说明将帮助您理解问题并能够自己解决问题。
您还必须 信任 错误消息。如果它说令牌的数量与绑定变量的数量不匹配,那 就是
。缺少的表或列也是如此。如果有选择,无论是您自己的错误还是错误消息是错误的,请始终坚持前者。再次听起来是屈尊的,但是这个站点上的数百个问题证明了此建议非常有用。
@
)!这使程序员无法读取错误消息,因此无法修复错误die()
或echo
或任何其他功能在屏幕上无条件地打印错误消息。PHP可以自行报告错误,并根据环境正确地执行操作-因此,只需将其留给PHP。if($result)
)。启用错误异常后,这种情况将毫无用处。try..catch
运算符来回显错误消息。应该使用该运算符执行一些错误处理,例如事务回滚。但是,切勿仅将其用于报告错误-正如我们上文所述,PHP已经可以正确的方式做到这一点。PS
有时没有错误,但也没有结果。这意味着 数据库中没有符合您条件的数据
。在这种情况下,即使您可以保证数据和条件都可以,也必须承认这一事实。他们不是。您必须再次检查它们。我有一篇关于如何调试数据库交互的文章可以为您提供帮助。尽管它是为PDO编写的,但原理是相同的。只需按照此说明逐步进行操作,即可解决您的问题或对堆栈溢出有一个可解答的问题。
我的代码如下: 我一直收到错误“调用布尔值上的成员函数bind_param()”。我找遍了整个S.O.,找到了几个例子,但没有一个能解决我的问题。我在代码中没有看到任何语法或打字错误。通过使用var_dump,我知道$_POST[“url”]和$_POST[“description”]存在并被正确接收。 想法还是帮助?
出于某种原因,我得到了。 致命错误:在第19行的D:\xampp\htdocs\tutioncenter\stud-editprofile_process.php中对布尔值调用成员函数bind_param() 我在另一个进程上使用了相同的函数,效果很好。我对编程很陌生,有人能帮我吗? 提前谢谢你!
在这个MySQL查询中,我一直在发牢骚。 假设我有这个: 有了那个- 当它碰到这条线时就会停止,我得到了这个错误: 第386行:
我一直被这个错误困扰,请帮助我这是我的PHP代码致命错误:调用成员函数bind_param()
密码 错误 致命错误:调用第26行C:\xampp\htdocs\create.php中布尔值的成员函数bind_param()
这是我代码的一部分 我得到一个错误致命错误:对$stmt行上的非对象调用成员函数bind_param()-