You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据库操作函数Fetch_num1运行时出现mysqli警告如何解决

报错产生的核心原因

两个警告是强连锁触发的,根源只有一个:

  • 方法内直接使用的$connection是未初始化的局部变量,实际值为null。PHP的类方法存在独立的局部作用域,方法内部默认无法直接读取类外部、类成员属性中定义的数据库连接对象,把这个null值传给mysqli_query时,直接触发第一个类型不匹配警告。
  • 因为mysqli_query拿到的连接对象不合法,根本无法执行SQL查询,函数会直接返回null作为查询结果。把这个null值传给mysqli_num_rows时,就会触发第二个类型不匹配警告。
对应问题的修正方案

按照根源逐一调整即可:

  1. 解决连接对象的作用域访问问题
    根据你的代码书写风格,选择对应方式把合法的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;
    }
    
  2. 增加基础失败校验
    拿到mysqli_query的返回值后,先校验是否为合法的mysqli_result对象,再调用mysqli_num_rows,避免连接断开、SQL语法错误等场景下触发连锁警告。
  3. 修复SQL注入隐患
    现有代码直接把传入的$id字符串拼接到SQL语句中,存在明显的注入风险,建议替换为预处理语句方式完成查询,不要直接拼接用户可控的参数。
    另外代码中临时调试用的echo "Hi",在确认连接问题修复后可以移除,避免影响接口正常返回格式。

内容的提问来源于stack exchange,提问作者Phani K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 13:15:02