我们在遇到向数据库中插入数据的时候,往往都是在页面上实现,新增一条或多条记录,要是数据少的话,还可以,但是数据要是很多非常多的话,要还是在页面上一条条的添加,这是非常费时间的,所以我们可以在页面上添加一个导入功能,将我们们需要的数据直接导入到数据库,而不是一条条的插入记录,下面是一些代码来实现导入功能的:
public function upload(){
if(IS_GET){
$this->display();
exit;
}
$upload=new \Think\Upload();//实例化上传类
$upload->maxSize =0;//设置附件上传大小
$upload->exts=array('csv');//设置上传文件的类型
$upload->rootPath='./Public/Upload/';//设置上传文件的根目录
$upload->savePath='';//设置上传文件子目录
//上传文件
$info =$upload->upload();
// dump($info);
// exit;
if(!$info){//上传错误提示信息
$this->error($upload->getError());
}else{//上传成功
$this->success('上传成功!'.$info['file']['sevepath'].$info['file']['savename']);
}
}
上面的方法会将你选中的文件上传到你设置的目录当中去,还没有实现将数据插入到数据库中,我们新建一个新的方法来实现将上传的文件插入到数据库中:
public function import(){
//$file是上传到你目录当中文件的路径
$file = "./Public/Upload/2018-03-26/5ab8c1ce7b2ca.csv";//检测文件的编码
$encoding=detect_encoding($file);
//如果不是utf8格式,则转换为utf8
if($encoding !='UTF-8'){
$contens=file_get_contents($file);
$contens=mb_convert_encoding($contens, 'utf-8',$encoding);
file_put_contents($file, $contens);
}
$fp =fopen($file,'r');
if($fp){
$fileds=array('no','name','sex');
$model =M('student');
$arrno=$model->getField('no',true);
$arr =array();
while(($row=fgetcsv($fp,1000,","))!==false);
$row=array_combine($fileds, $row);
// $row['py']=$SpGetPinyin($row['name'],'UTF-8');
if(in_array($row['no'],$arrno )){
$file='./Public/upload/text.txt';
$current .=$row['no'].'已存在'.'<br>';
file_put_contents($file,$current);//把一个字符串写到一个文件里
}else{
$arrno[]=$row['no'];
$arr[]=$row;
$file='./Public/upload/text.txt';
$current1 .=$row['no'].'导入成功'.'<br>';
file_put_contents($file,$current1);
}
if(count($arr)==1000){
$model->addAll($arr);
unset($arr);
}
}