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

如何解决mysqli_fetch_assoc期望参数/调用成员函数bind_param错误如何获取并修复实际的mysql错误?

有时候,你的库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编写的,但原理是相同的。只需按照此说明逐步进行操作,即可解决您的问题或对堆栈溢出有一个可解答的问题。

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-