php - mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

在本地/开发环境中,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 parameterCall 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的文章的要点:
在开发和实时服务器上报告错误必须不同。在dev服务器上,在屏幕上显示错误是很方便的,但是在live服务器上,必须记录错误消息,这样您就可以在服务器的错误日志中找到它。
必须将相应的配置选项设置为以下值
在开发服务器上
error_reporting应设置为E_ALL值;
log_errors应该设置为1(在dev 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的非主题,但您可以在上面链接的文章中阅读它。
如何处理收到的错误消息
在收到错误消息后,您必须阅读并理解它。这听起来太明显了,但学习者往往忽视了错误信息的极端帮助性。但大多数情况下,它很直接地解释了这个问题。如果说特定的表格不存在,你必须检查拼写、拼写错误、字母情况、证书等。或者,如果它说SQL语法有错误,那么您必须检查SQL。问题点就在错误消息中引用的查询部分之前。
如果你不明白错误信息,试着用谷歌搜索它。在浏览结果时,请坚持使用解释错误信息的答案,而不是直截了当地给出解决方案。一个解决方案可能在你的特定情况下不起作用,但是这个解释将帮助你理解这个问题,并使你能够自己解决它。
您还必须信任错误消息。如果它说令牌的数量与绑定变量的数量不匹配,那么它就是这样。不存在的表或列也是如此。如果有选择,不管是你自己的错误还是错误信息是错误的,都要坚持前者。同样,这听起来有点屈尊,但是这个网站上的数百个问题证明了这个建议非常有用。
错误报告方面不应该做的事情的列表
切勿使用错误抑制运算符(@)!它使程序员无法读取错误消息,因此无法修复错误
不要使用die()echo或任何其他功能无条件地在屏幕上打印错误消息。PHP将自行报告,并根据环境选择正确的方法。
不要添加条件来手动测试查询结果(如if($result))。您的查询失败,并且您将已经得到错误异常,或者它是正常的,没有什么要测试的。
不要使用try..catch运算符来回显错误消息。此运算符应用于执行某些错误处理,如事务回滚。但千万不要仅仅用它来报告错误——正如我们在上面所了解到的,PHP已经可以用正确的方法来做了。
附笔。
有时没有错误,但也没有结果。这意味着,数据库中没有与您的条件匹配的数据。在这种情况下,你必须承认这个事实。即使你能保证数据和标准都是正确的。他们不是。你得再检查一遍。我有一篇文章可以帮助解决这个问题,How to debug database interactions。虽然它是为PDO编写的,但原理是一样的。只要按照这条指令一步一步地去做,要么你的问题解决了,要么你的堆栈溢出问题有了答案。

译文:来源   文章分类: php mysqli prepared-statement environment error-reporting

相关文章:

php - 单击提交codeigniter后找不到对象(错误404)

javascript - 在树枝中渲染控制器时重定向SYMFONY 302

php - Laravel 5.4 OAuth与Dingo内部请求

php - 如何使用CURL获取HTTPS的正文内容

javascript - 开始和结束日期是Zebra DatePicker的同一天

php - Symfony学说数据库规范化

php - 在平等比较会产生与严格的相等比较相同的结果的情况下,应该使用哪两个?

php - 以编程方式访问Facebook的“查看友谊”历史记录

php - ssh2通过php连接到Linux

php - 在变量中添加带空格的动态链接