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

CodeIgniter模型调用num_rows()触发布尔值错误,求解决方法

解决CodeIgniter中Call to a member function num_rows() on boolean错误

这个错误的核心原因很明确:你的$this->db->query($checkQry2)执行失败了,返回了false而非预期的查询结果对象,此时调用num_rows()自然会触发报错。咱们一步步来排查解决:

第一步:定位查询失败的具体原因

在执行查询后立刻加入错误检查,这样能直接获取数据库返回的错误详情——比如表名拼写错误、字段名写错、数据库权限问题等:

public function getUniqueIdentifier() {
    $Uuid = '';
    $checkStatus = true;
    while ($checkStatus) {
        $Uuid = $this->generate_uuid();
        $checkQry2 = "select * from Leads where controllNumber=" . $this->db->escape($Uuid);
        $checkRes2 = $this->db->query($checkQry2);
        
        // 新增:检查查询是否失败
        if (!$checkRes2) {
            // 打印错误信息,上线前记得注释或替换为日志记录
            var_dump($this->db->error());
            die();
        }
        
        $checkRes2 = $checkRes2->num_rows();
        if ($checkRes2 === 0) {
            $checkStatus = false;
        }
    }
    return $Uuid;
}

运行后你就能看到具体错误提示,比如常见的:数据库表名实际是小写的leads但你写了Leads,或者字段名controllNumber多打了一个l(应该是controlNumber)。

第二步:改用CodeIgniter查询构建器,规避手动SQL的坑

手动拼接SQL字符串很容易出错,而且CodeIgniter的查询构建器会自动处理转义、语法校验,更安全也更易维护。把查询逻辑改成这样:

public function getUniqueIdentifier() {
    $Uuid = '';
    $checkStatus = true;
    while ($checkStatus) {
        $Uuid = $this->generate_uuid();
        // 使用查询构建器重构查询
        $checkRes2 = $this->db->where('controllNumber', $Uuid)
                              ->get('Leads');
        
        // 检查查询是否失败
        if (!$checkRes2) {
            var_dump($this->db->error());
            die();
        }
        
        if ($checkRes2->num_rows() === 0) {
            $checkStatus = false;
        }
    }
    return $Uuid;
}

这样既避免了手动拼接SQL的低级错误,还自动处理了变量转义,从根源上降低SQL注入风险。

第三步:优化UUID生成逻辑(可选但推荐)

你当前的generate_uuid()只是返回占位字符串,实际项目中应该用真正的UUID生成方法,比如PHP原生函数或兼容写法:

public function generate_uuid() {
    // PHP 7+ 可直接用原生函数
    return uuid_create(UUID_TYPE_RANDOM);
    
    // 兼容PHP旧版本的写法
    // return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    //     mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    //     mt_rand(0, 0xffff),
    //     mt_rand(0, 0x0fff) | 0x4000,
    //     mt_rand(0, 0x3fff) | 0x8000,
    //     mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    // );
}

真正的UUID能大幅降低循环次数,提升方法执行效率。

最后提醒

上线前一定要把var_dump($this->db->error());和die();去掉,或者替换为日志记录,不要把错误信息暴露给用户。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:40:37