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

CodeIgniter导入含CSS代码的SQL文件报错,如何解决?

解决CodeIgniter导入含CSS代码的SQL时的1064语法错误

问题根源

CodeIgniter的数据库处理机制会默认把SQL中的:识别为参数绑定占位符,同时拆分SQL语句时,容易误将CSS代码里的分号;当成SQL语句的结束标记,导致解析报错。而PhpMyAdmin是直接将完整SQL提交给MySQL处理,不会触发框架的解析冲突。

可行解决方案

1. 直接执行完整SQL内容(适合小体积SQL文件)

跳过CodeIgniter的语句拆分和参数解析逻辑,直接读取完整SQL文件内容后执行:

public function demo_importer_post() {
    // 替换为你的SQL文件实际路径
    $sql_file = APPPATH . 'data/demo.sql';
    $sql_content = file_get_contents($sql_file);
    
    if ($this->db->query($sql_content)) {
        // 导入成功逻辑
        echo "数据导入完成";
    } else {
        // 输出错误信息
        $error = $this->db->error();
        echo "导入失败:" . $error['message'];
    }
}

注意:如果SQL文件过大,可能会占用较多内存,需根据服务器配置调整。

2. 使用simple_query()执行含CSS的单条语句

针对包含CSS代码的UPDATE/INSERT语句,用simple_query()替代默认的query(),该方法不会解析参数占位符:

// 示例UPDATE语句,包含完整CSS代码
$update_sql = "UPDATE page_styles SET css_code = 'header { background: #fff; padding: 10px; }' WHERE page_id = 2";
// 执行语句
$this->db->simple_query($update_sql);

3. 正确拆分SQL语句(避免误拆分字符串内的分号)

如果需要拆分SQL逐条执行,用正则表达式忽略字符串内部的分号,只拆分真正的SQL语句分隔符:

public function demo_importer_post() {
    $sql_content = file_get_contents(APPPATH . 'data/demo.sql');
    // 正则拆分:跳过单/双引号内的分号,仅拆分语句间的分号
    $sql_statements = preg_split('/;\s*(?=(?:[^"\']|["\'][^"\']*["\'])*$)/', $sql_content);
    
    foreach ($sql_statements as $stmt) {
        $stmt = trim($stmt);
        if (!empty($stmt)) {
            $this->db->query($stmt);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:30:43