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

