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

CodeIgniter数据库备份如何为INSERT语句值添加单引号?

解决CodeIgniter数据库备份INSERT语句值无单引号的问题
  • 问题根源:当前dbutil->backup()导出的INSERT语句里,字符串(如Student)未被单引号包裹,会被数据库识别为标识符引发报错;数字虽部分数据库可兼容,但统一添加单引号能提升SQL的兼容性与安全性。

  • 修改方案:先导出纯文本格式的SQL,对INSERT语句的值部分做正则替换添加单引号,再手动压缩为zip文件下载,具体代码修改如下:

public function create()
{
    // 加载所需类库与助手
    $this->load->dbutil();
    $this->load->helper('download');
    $this->load->library('zip');
    
    $test = date('YmdS-His');
    // 配置备份参数,先导出为纯文本SQL
    $config = array (
        'format' => 'txt',
        'filename' => 'bubblebee_'.$test.'_db.sql',
        'add_drop' => TRUE,
        'add_insert' => TRUE,
        'newline' => "\n",
        'foreign_key_checks' => FALSE,
    );

    // 获取未处理的纯SQL内容
    $raw_sql = $this->dbutil->backup($config);
    
    // 正则匹配INSERT语句,为所有值添加单引号并转义内部单引号
    $processed_sql = preg_replace_callback(
        '/INSERT INTO `([^`]+)` \(([^)]+)\) VALUES \(([^;]+)\);/',
        function($matches) {
            $values = explode(', ', $matches[3]);
            $quoted_values = array_map(function($val) {
                return "'" . str_replace("'", "\\'", $val) . "'";
            }, $values);
            return "INSERT INTO `{$matches[1]}` ({$matches[2]}) VALUES (" . implode(', ', $quoted_values) . ");";
        },
        $raw_sql
    );
    
    // 将处理后的SQL添加到zip压缩包
    $this->zip->add_data("bubblebee_{$test}_db.sql", $processed_sql);
    $zip_content = $this->zip->get_zip();
    
    // 触发下载
    $db_name = "bubblebee_{$test}.zip";
    force_download($db_name, $zip_content);
}
  • 注意事项:
    • 上述正则基于导出SQL格式为INSERT INTO table (col1, col2) VALUES (val1, val2);的情况,若你的导出格式有差异需调整正则表达式
    • 若数据值中包含, (逗号加空格),该分割方式会出错,可根据实际导出的VALUES分隔符调整explode的参数
    • 该方法无需修改框架核心文件,避免了框架升级带来的覆盖问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:43