如何在CodeIgniter中导入加密SQL文件?现有恢复代码无法适配
在CodeIgniter中恢复加密SQL文件的解决方案
首先,我注意到你的问题核心是:备份时用CodeIgniter的encrypt库加密了SQL内容,但恢复代码直接读取未解密的文件,导致无法处理。下面是具体的修复步骤和代码调整:
1. 先修正备份代码的小问题(可选但重要)
看你的备份代码,你写入本地文件的是未加密的$backup,但下载给用户的是加密后的$encrypt_backup——这会导致本地保存的是明文,下载的是密文,容易混淆。如果希望本地备份也是加密的,把写入文件的代码改成:
write_file($save, $encrypt_backup);
2. 修改恢复代码:先解密再执行SQL
加密后的SQL文件不能直接按行读取(加密会破坏原有的换行结构),必须先读取整个文件内容,解密后再拆分SQL语句执行。修改后的恢复代码如下:
public function restore() { // 替换成你的加密SQL文件路径 $filename = 'C:\Users\ASUS\Desktop\backup-on-XXXX-XX-XX.sql'; // 1. 读取整个加密文件的内容 $encrypted_content = file_get_contents($filename); // 2. 加载encrypt库并解密内容 $this->load->library('encrypt'); $decrypted_sql = $this->encrypt->decode($encrypted_content); // 3. 可靠拆分SQL语句(避免字符串内的分号导致错误) $sql_statements = preg_split('/;\s*[\r\n]+/', trim($decrypted_sql)); $this->load->model('Setting_model'); // 4. 逐个执行SQL语句 foreach ($sql_statements as $stmt) { $stmt = trim($stmt); // 跳过空语句 if (!empty($stmt)) { $this->Setting_model->restore($stmt); } } $msg_info2 = 'Database successfully Restored'; $this->session->set_flashdata('msg_info2', $msg_info2); }
关键注意事项
- 加密密钥必须一致:确保备份和恢复时,CodeIgniter配置文件中的
$config['encryption_key']完全相同,否则解密会得到乱码。 - 加密配置保持一致:如果备份时修改过
encrypt库的算法(比如$config['encryption_cipher']),恢复时也要保持相同配置。 - 测试解密结果:可以先在代码中临时添加
echo $decrypted_sql; exit;,确认解密后的内容是正常的SQL语句,再执行恢复操作,避免执行错误内容。
内容的提问来源于stack exchange,提问作者MAJ
相关产品推荐
相关产品推荐

