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

CodeIgniter连接远程SQL Server报错:在布尔值上调用num_rows()

问题解决步骤

1. 核心错误原因

Call to a member function num_rows() on bool 说明你的数据库查询$this->db->get('T_ADMIN')执行失败,返回了布尔值false而非查询结果对象。同时代码里的count($q_cek->num_rows())是完全错误的写法——num_rows()本身就会返回查询到的行数(整数),套count()毫无意义,还会在查询失败时触发致命错误。

2. 分步解决

第一步:排查跨服务器数据库连接有效性

因为你要连接的是另一台云服务器的SQL Server,先确认以下配置:

  • 打开application/config/database.php,检查SQL Server的连接参数:
    • hostname:云服务器的公网IP或域名,需确保带正确端口(默认1433,格式如xxx.xxx.xxx.xxx:1433)
    • username/password:SQL Server的合法账号密码
    • database:目标数据库名称
    • dbdriver:设置为sqlsrv(CodeIgniter连接SQL Server需要此驱动,且主机需安装对应扩展)
  • 确认云服务器的SQL Server允许你的主机IP访问(在SQL Server防火墙规则、登录账号权限中配置)
  • 测试连接:可在控制器中添加以下代码验证连接状态:
$this->load->database();
if ($this->db->conn_id) {
    echo "数据库连接成功";
} else {
    echo "数据库连接失败:" . print_r($this->db->error(), true);
}

第二步:修复登录代码的逻辑错误

替换原代码中的查询处理部分,先判断查询是否成功,再获取行数:

public function do_login() {
    $u      = $this->security->xss_clean($this->input->post('u'));
    $ta     = $this->security->xss_clean($this->input->post('ta'));
    $p      = $this->security->xss_clean($this->input->post('p'));
        
    $this->db->where('username', $u);
    $this->db->where('password', $p);
    $q_cek  = $this->db->get('T_ADMIN');

    // 先判断查询是否成功
    if ($q_cek === false) {
        // 输出数据库错误信息(调试用,上线后删除)
        var_dump($this->db->error());
        $this->session->set_flashdata("k", "<div id=\"alert\" class=\"alert alert-error\">数据库查询失败</div>");
        redirect('index.php/admin/login');
        return;
    }

    $j_cek = $q_cek->num_rows(); // 直接获取行数,无需套count()
    $d_cek = $q_cek->row();
        
    if($j_cek == 1) {
        $data = array(
                'admin_id' => $d_cek->id,
                'admin_user' => $d_cek->username,
                'admin_nama' => $d_cek->nama,
                'admin_ta' => $ta,
                'admin_level' => $d_cek->level,
                'admin_valid' => true
        );
        $this->session->set_userdata($data);
        redirect('index.php/admin');
    } else {    
        $this->session->set_flashdata("k", "<div id=\"alert\" class=\"alert alert-error\">username or password is not valid</div>");
        redirect('index.php/admin/login');
    }
}

第三步:额外建议(重要)

  • 禁止明文存储密码:当前代码直接对比明文密码,风险极高。应在用户注册时用password_hash()加密密码,登录时用password_verify()验证,替换原有的password字段对比逻辑。
  • 开启调试模式:在application/config/config.php中设置$config['debug'] = true;,可查看更详细的数据库错误信息,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:37:53