数据库操作函数Fetch_num1运行时出现mysqli警告如何解决
报错产生的核心原因
两个警告是强连锁触发的,根源只有一个:
- 方法内直接使用的
$connection是未初始化的局部变量,实际值为null。PHP的类方法存在独立的局部作用域,方法内部默认无法直接读取类外部、类成员属性中定义的数据库连接对象,把这个null值传给mysqli_query时,直接触发第一个类型不匹配警告。 - 因为
mysqli_query拿到的连接对象不合法,根本无法执行SQL查询,函数会直接返回null作为查询结果。把这个null值传给mysqli_num_rows时,就会触发第二个类型不匹配警告。
对应问题的修正方案
按照根源逐一调整即可:
- 解决连接对象的作用域访问问题
根据你的代码书写风格,选择对应方式把合法的mysqli连接对象引入到方法作用域内:- 面向对象类写法:把数据库连接存为类的私有成员属性,在构造方法中完成连接初始化,方法内部通过
$this->connection访问连接对象,不能直接写裸的$connection局部变量。修正后的参考代码如下:
// 类内定义连接属性 private $connection; public function __construct() { // 构造方法中初始化数据库连接 $this->connection = mysqli_connect('主机地址', '数据库账号', '数据库密码', '目标库名'); } public function Fetch_num1($id) { $sql = "SELECT * FROM editors where jid='$id'"; // 使用类属性中存储的连接对象发起查询 $result = mysqli_query($this->connection, $sql); $nr = mysqli_num_rows($result); return $nr; }- 面向过程全局连接写法:在方法最开头加
global $connection声明,把全局作用域下的合法连接对象引入到方法局部作用域内。修正后的参考代码如下:
public function Fetch_num1($id) { // 引入全局作用域的数据库连接对象 global $connection; $sql = "SELECT * FROM editors where jid='$id'"; $result = mysqli_query($connection, $sql); $nr = mysqli_num_rows($result); return $nr; } - 面向对象类写法:把数据库连接存为类的私有成员属性,在构造方法中完成连接初始化,方法内部通过
- 增加基础失败校验
拿到mysqli_query的返回值后,先校验是否为合法的mysqli_result对象,再调用mysqli_num_rows,避免连接断开、SQL语法错误等场景下触发连锁警告。 - 修复SQL注入隐患
现有代码直接把传入的$id字符串拼接到SQL语句中,存在明显的注入风险,建议替换为预处理语句方式完成查询,不要直接拼接用户可控的参数。
另外代码中临时调试用的echo "Hi",在确认连接问题修复后可以移除,避免影响接口正常返回格式。
内容的提问来源于stack exchange,提问作者Phani K
相关产品推荐
相关产品推荐

