CodeIgniter中real_escape_string() on boolean错误排查与解决
这个错误的核心本质是:你的CodeIgniter应用没有成功建立MySQL数据库连接,导致$this->db底层依赖的mysqli连接对象变成了布尔值false。当你调用$this->db->where()方法时,驱动内部尝试调用real_escape_string()这个mysqli连接对象的方法,自然就会抛出"Call to a member function on boolean"的报错——毕竟布尔值没有任何方法可言。
你的$where数组格式完全正常,和这个错误没有关系,问题100%出在数据库连接环节。结合你的环境(CI3.0.4 + PHP7.2 + MySQL5.7),我整理了以下排查和解决步骤:
可能的原因与对应解决方法
1. 数据库配置文件错误(最常见)
打开application/config/database.php,仔细核对每一项配置,尤其是以下关键字段:
$db['default'] = array( 'hostname' => 'localhost', // 尝试换成127.0.0.1试试(localhost用socket,127.0.0.1用TCP,MySQL5.7偶尔有兼容差异) 'username' => '你的数据库用户名', // 比如root或自定义用户 'password' => '你的数据库密码', // 注意特殊字符不需要转义,直接写原始密码 'database' => '要连接的数据库名称', // 确认这个数据库在MySQL中确实存在 'dbdriver' => 'mysqli', // 必须是mysqli,不能写错 'db_debug' => TRUE, // 强烈打开这个选项,它会直接显示具体的连接错误(比如权限拒绝、数据库不存在),比当前的模糊报错有用得多 'pconnect' => FALSE, // CI3推荐关闭持久连接,避免连接池异常 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci' );
2. MySQL服务未启动或无法访问
在Ubuntu终端执行以下命令检查MySQL状态:
sudo systemctl status mysql
如果服务未运行,启动它:
sudo systemctl start mysql
如果经常出现服务中断,可以设置开机自启:
sudo systemctl enable mysql
3. 数据库用户权限不足
登录MySQL终端,检查你的数据库用户是否拥有目标数据库的访问权限:
-- 查看现有用户及允许的连接主机 SELECT user, host FROM mysql.user; -- 如果你的用户没有localhost权限,创建并授权: CREATE USER '你的用户名'@'localhost' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'localhost'; FLUSH PRIVILEGES;
4. PHP的mysqli扩展未启用
虽然PHP7.2默认应该启用mysqli,但还是要确认:
在终端执行:
php -m | grep mysqli
如果没有输出,编辑Apache对应的php.ini文件(通常路径是/etc/php/7.2/apache2/php.ini),找到;extension=mysqli这一行,去掉前面的分号,然后重启Apache:
sudo systemctl restart apache2
5. 手动测试底层连接(排除CI框架问题)
在你的模型或控制器中加入一段原生mysqli连接代码,直接测试底层连接是否正常:
$conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名'); if (!$conn) { die('连接错误: ' . mysqli_connect_error()); } echo '连接成功'; mysqli_close($conn);
如果这段代码报错,说明问题在MySQL或PHP环境,和CodeIgniter无关;如果能正常连接,再回到CI的配置文件排查细节。
内容的提问来源于stack exchange,提问作者Thiago Bittencourt

