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

