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
相关产品推荐
相关产品推荐

