在我的本地/开发环境中,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);

为了判断我的查询,我try 通过控制面板phpMyAdmin执行查询,结果是OK.

推荐答案

TL;博士

  1. mysqli连接代码中始终包含mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);.它将让MySQL告诉您实际的问题是什么,无论是查询、服务器、数据库还是其他方面.
  2. 始终用问号替换SQL查询中的每个PHP变量,并使用prepared statement执行查询.这将有助于避免各种语法错误.

解释

有时,您的MySQLi代码会产生类似mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given...Call to a member function bind_param()...或类似的错误.或者甚至没有任何错误,但是查询并不都能正常工作.这意味着您的查询执行失败.

每次查询失败,MySQL都有an error message that explains the reason个.不幸的是,默认情况下,此类错误不会传输到PHP,您得到的只是上面提到的一条隐晦的错误消息.因此,配置PHP和MySQLi向您报告MySQL错误非常重要.一旦您收到错误消息,修复它将是小菜一碟.

如何在MySQLi中获取错误消息

首先,在您的环境中使用MySQLi connect之前,请始终使用以下命令:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

之后,所有MySQL错误都将被转移到PHP异常中.反过来,一个未捕获的异常会导致一个PHP致命错误.因此,在MySQL错误的情况下,您将得到一个常规的PHP错误.这会立即让你意识到错误的原因.堆栈跟踪将 bootstrap 您找到错误发生的确切位置.

如何在不同环境中配置PHP

以下是我关于PHP error reporting的文章的要点: 在开发服务器和实时服务器上报告错误必须不同.在开发服务器上,将错误显示在屏幕上比较方便,但在实时服务器上,必须记录错误消息,以便以后可以在错误日志(log)中找到它们.

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

  • 在开发服务器上

  • error_reporting应设置为E_ALL值;

  • log_errors应该设置为1(在开发PC上也有日志(log)很方便)

  • display_errors应设置为1

  • 在生产服务器上

  • error_reporting应设置为E_ALL值;

  • log_errors应该设置为1

  • display_errors应该设置为0

如何实际使用它

Just remove any code that checks for the error manually,所有那些or die()if ($result)等等.只需立即编写数据库交互代码:

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

还是without any conditions around.如果出现错误,它将被视为代码中的任何其他错误.例如,在一台开发PC上,它只会出现在屏幕上,而在一个实时站点上,它会被程序员记录下来,而为了方便用户,你可以使用一个错误处理程序(但这是另一个故事,对于MySQLi来说是离题的,但你可以在上面链接的文章中阅读).

如何处理收到的错误消息

首先,您必须找到问题查询.错误消息包含错误发生位置的the file name and the line number个确切位置.对于简单的代码来说,这就足够了,但是如果您的代码使用的是函数或类,您可能需要遵循stack trace来定位有问题的查询.

收到错误信息后,您必须阅读并理解它.如果不是居高临下的话,这听起来太明显了,但学习者往往忽略了这样一个事实,即错误消息不仅仅是一个报警信号,实际上还包含一个detailed explanation of the problem.你只需要阅读错误信息并解决问题.

  • 比如说,如果它说某个特定的表格不存在,你必须判断拼写、打字错误和字母大小写.此外,还必须确保PHP脚本连接到正确的数据库
  • 或者,如果它说SQL语法中有错误,那么您必须判断SQL.问题就在错误消息中引用的查询部分的右边.

如果你不明白错误信息,试着用谷歌搜索.在浏览结果时,坚持给出错误答案,而不是直截了当地给出解决方案.解决方案可能不适用于您的特定情况,但解释将帮助您理解问题,并使您能够自行解决问题.

您还必须将错误消息设置为trust.如果它说令牌的数量与绑定变量的数量不匹配,那么它is就是这样.缺少的表或列也是如此.如果可以 Select ,无论是您自己的错误还是错误消息,始终坚持前者.再说一次,这听起来很居高临下,但这个网站上的数百个问题证明了这个建议非常有用.

关于错误报告,列出了您永远不应该做的事情

  • 切勿使用错误 suppress 运算符(@)!这会使程序员无法读取错误消息,因此无法修复错误
  • 请勿使用die()echo或任何其他功能在屏幕上无条件打印错误信息.PHP可以自行报告错误,并根据环境的不同以正确的方式进行报告-因此只需将其留给PHP即可.
  • 不要添加条件来手动测试查询结果(比如if($result)).如果启用了错误例外,那么这种情况将毫无用处.
  • 请勿使用try..catch操作符 echo 错误信息.应该使用此运算符执行一些错误处理,如事务回滚.但是千万不要仅仅用它来报告错误--正如我们在上面了解到的,PHP已经可以通过正确的方式做到这一点.

P.S.
Sometimes there is no error, but no results either. Then it means, there is no data in the database to match your criteria. In this case you have to admit this fact, even if you can swear the data and the criteria are all right. They are not. You have to check them again.

我有一篇文章可以在这件事上有所帮助,100.虽然它是为PDO编写的,但原理是相同的.只需一步一步地按照这些说明操作,您的问题就会得到解决,或者堆栈溢出会有一个可回答的问题.

Php相关问答推荐

打印SQL表内容时在DIV内添加断点

如何让PHP变量跨越多个脚本调用?

如何显示每个分类的当前术语的帖子中包含的前20个标签,不包括标签分类

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

Laravel POST方法返回状态:POST方法上不允许使用405方法

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

无法使用php IMAP从Gmail获取收件箱

根据发货类别在WooCommerce产品页面中显示快捷代码

未收到Strava WebHook事件数据

在WooCommerce Admin产品列表自定义列中显示来自元数据的统计数据

Woocommerce 相关产品按其类别或排名数学主要类别

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

后退按钮不起作用 laravel ajax crud

Woocommerce API 的 PHP Curl 附加参数

如何通过工厂为点列制作一个假坐标?

显示时间范围内的可用空位,同时考虑已预订的空位

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

如何从此字符串创建 Carbon 对象:2022-06-21T05:52:46.648533678Z?

如果 static:: 被解析为B,为什么 PHP 会执行A的方法

如何从 PHP 中的字符串位置排除图像扩展名