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 INTOtable(col1,col2) VALUES (val1, val2);的情况,若你的导出格式有差异需调整正则表达式 - 若数据值中包含
,(逗号加空格),该分割方式会出错,可根据实际导出的VALUES分隔符调整explode的参数 - 该方法无需修改框架核心文件,避免了框架升级带来的覆盖问题
- 上述正则基于导出SQL格式为
内容的提问来源于stack exchange,提问作者Leo Wlo
相关产品推荐
相关产品推荐

