要求:将用户uid批量导出,并且每5000个放到一个txt文件中,使用英文逗号分隔用户uid;
思路:自定义一个文件夹,在每次导出的时候,先将这个文件夹中的文件删除,之后再重新导出新的文件,使用日期区分是否导出成功;一次性查出满足的所有数据,每5000条存入一个文件,可以使用array_chunk()函数分隔原始数组,之后再使用array_column()
函数取出数组中的uid这一列的数据,最后使用import()函数将uid组合成用英文逗号分隔的字符串,存入txt文件中。
sql查询使用ThinkPHP框架方式。
//批量导出数据并且写入txt文件中
public function export_uids(){
$filepath = $_SERVER['DOCUMENT_ROOT'].'/Uploads/downuids';
//创建目录
$dir = iconv("UTF-8", "GBK", $filepath);
if (!file_exists($dir)){
mkdir ($dir,0777,true);
} else {
//文件已存在,修改权限
chmod($dir, 0777);
}
//删除文件夹下所有的文件
$this->deldir($filepath);
$presell = D('presell');
$map['p.organizationpath'] = array('EXP',"REGEXP '-3-'");
$map['p.classesid'] = array('EXP',"NOT REGEXP '5'");
$map['p.uid'] =array('NEQ',0);
$map['u.phone'] =array('NEQ','');
$map['ut.device_token'] =array('NEQ','');
$result = $presell->alias('p')->field("p.uid")->join("LEFT JOIN `user` as u ON p.uid=u.id")
->join("LEFT JOIN `user_tuisong` as ut on ut.uid = u.id")
->where($map)
->order("p.uid asc")
->select();
$res_arr = array_chunk($result,5000);//将数组每5000条数据分一组
$uids_arr = array();
foreach($res_arr as $key => $val){
$uids_arr[$key] = trim(implode(',',array_column($val,'uid')));
}
if(!empty($uids_arr) && count($uids_arr) != 0){
//写入到文件
foreach($uids_arr as $key => $val){
$filename = intval($key + 1).'-'.date('Ymd',time()).'.txt';
$fp2 = @fopen($filepath.'/'.$filename, "a");
fwrite($fp2, trim($val));
fclose($fp2);
}
echo 'success';exit;
}else{
echo '没有查询到用户数据';exit;
}
}
//删除文件夹内元素
function deldir($dir)
{
//删除目录下的文件:
$dh=opendir($dir);
while ($file=readdir($dh))
{
if($file!="." && $file!="..")
{
$fullpath=$dir."/".$file;
if(!is_dir($fullpath))
{
unlink($fullpath);
}
else
{
$this->deldir($fullpath);
}
}
}
closedir($dh);
}