解决上传文件重复问题
这篇文章主要介绍一下在我们上传文件中会出现一些重复上传的问题,那么这些问题应该怎么解决呢?
事例:例如我们想要将一个写有学生信息的csv文件导入到数据库的学生表中。那么我们将面临一些重复问题。
- 在csv文件中,存在多条完全相同的信息(简单来说也就是一个同学存在多次 )。
- 第一次导入成功后,第二次导入后,已经存在的同学便不需要在导入到学生表中了。
那么我们来想一个方法:
- 取的student表中的学号,将学号存入一个数组中($arrNo)。
- 循环读取CSV文件中的学生信息。
- 用CSV文件中的学号去和$arrNo中的学号进行比较
- 如果已经存在:那么则继续读取下一行数据进行比较。
- 如果不存在,①将CSV文件中的学号追加到$arrNo中(为了防止csv文件中,存在多条完全相同的信息,这样做之后第二次遇到这个信息,就会显示已经存在了。)②将CSV文件中的这条数据存放入一个空数组($arr)中。
- 最后我们将$arr这个数组中的内容添加到数据库学生表中就解决了重复问题。
下边我们来看一个简单的图,图中画出了上边我们的思维:
代码如下:
$fp=fopen($file, 'r');//只读方式打开CSV文件,将文件指针指向文件头
if ($fp) {
$arrNo=M('student')->getField('no',true);//一维数组获取原表所有的学号存入数组
//新建一个数组(因为CSV文件中的下标从0开始,后边我们需要合并两个数组)
$filed=array('no','name','sex');
$model=M('student');//实例化数据表
$arr=array();//创建一个空数组
//循环读取csv文件
while (($row=fgetcsv($fp,1000,','))){
//在文件中学号下标为0,判断是否存在在arrNo中存在输出已存在不存在时将新建的用字段作为下标的信息存入arr空数组中,并且存入arrNo中,以防下一次查询
if(in_array($row['0'], $arrNo)){
echo $row['0'] . "已经存在!";
}else{
//创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其。将数据添加到空数组$arr中
$arr[] = array_combine($filed, $row);
$arrNo[]=$row['0'];//将学号追加到$arrNo中
}
if (count($arr)==1000) {
$model->addAll($arr);//最后将$arr中的数据添加到数据库中
unset($arr);
}
}
if (count($arr)>0) {
$model->addAll($arr);
}
$this->show('插入成功','utf8');
}