|
项目中碰到一个备份和导入的需求,在坛子里找了一下,看到jeongee的http://codeigniter.org.cn/forums ... thread&tid=6626。原封照抄不行,就在这个基础上改动了一下。下面是代码:
PHP复制代码
$sql = '';
$f = DBBACKUP .$file_name;
$f = read_file ($f);
$f = preg_replace("/#(.*)\\s#(.*)TABLE(.*)(.*)\\s#/i","",$f);
$f = write_file (DBBACKUP .$file_name, $f);
$file = DBBACKUP .$file_name;
$f = file($file);
array_filter($f);
foreach((array)$f as $l) {
$sql .= $l;
}
$i = 0;
$sql_arr = explode(';', $sql);
$sql_count = count($sql_arr)-1;
foreach ($sql_arr as $s){ $i ++;
if ($i <= $sql_count){
if (! $this->db->query($s)) show_error ('导入'.$s.'表数据失败。');
}
} 复制代码
稍微解释一下:
DBBACKUP是我定义的一个常量,位置在根目录下我设定的一个文件夹中。实际项目中,index.php同级目录下,最好不要有其他的东东,否则很容易被扫描到……,当然,自己测试是另外一回事了。
1.首先用read_file把备份文件读到一个字符串中。注意,需要加载file_helper.
2.然后用jeongee提供的正则过滤备份文件中的注释.
3.再用write_file把字符串写到同名文件中.(之所以来回折腾绝不是闲的蛋疼,而是换成数组操作后会报各种错误.如果有疑问,琢磨下数组和字符串的转换就明白了。preg_replace只能针对于字符串,而不是数组。)
4.用file函数把备份文件装入一个数组中.再用array_filter()过滤。
剩下的就是数组操作了。但我仍然用两个变量($i,$sql_count)控制foreach的进度,以免array_filter()过滤不干净,造成空值执行mysql_query()报错。
jeongee用的是MYSQL命令行的source函数,这个在实际项目中可能不行吧,至少经我手配置的Linux服务器,基本上除非我用的时候,这些函数都是屏蔽掉的。
仅供参考,欢迎交流。
|
|