PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > Fastadmin

import导入功能详解

管理员 2024-12-14
Fastadmin
7

导入分两个大的步骤
一、通过 ajax/upload 上传文件,这部分会读取到extra/upload.php 里面的相关配置
二、导入数据库,这一项分为以下几个部分:
1、第一部分:实例化reader

也就是根据文件后缀来判断该用哪个类去读取该文件,其中csv的文件涉及编码问题,需要转换为utf8,所有上面有一大段的处理代码。
if ($ext === 'csv') {    $file = fopen($filePath, 'r');    $filePath = tempnam(sys_get_temp_dir(), 'import_csv');    $fp = fopen($filePath, "w");    $n = 0;    while ($line = fgets($file)) {        $line = rtrim($line, "nr");        $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);        if ($encoding != 'utf-8') {            $line = mb_convert_encoding($line, 'utf-8', $encoding);        }        if ($n == 0 || preg_match('/^".*"$/', $line)) {            fwrite($fp, $line . "n");        } else {            fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . ""n");        }        $n++;    }    fclose($file) || fclose($fp);    $reader = new Csv();} elseif ($ext === 'xls') {    $reader = new Xls();} else {    $reader = new Xlsx();}

2、第二部分:建立文件首行标题与数据库字段对应关系数组

    $fieldArr = ['名字'=>'name','年龄'=>'age','性别'=>'sex']
$importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';$table = $this->model->getQuery()->getTable();$database = thinkConfig::get('database.database');$fieldArr = [];$list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);foreach ($list as $k => $v) {    if ($importHeadType == 'comment') {        $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];    } else {        $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];    }}

也可以不按照它这样,直接自定义,写死

3、第三部分:加载文件,读取数据,组装数据

    先读取第一行的标题,例如:$fields = ['名字','年龄','性别']    然后从第二行读取数据,例如:$values = ['test',18,'男']    接着用array_combine 合并成这样的数据  ['名字'=>'test','年龄'=>18,'性别'=>'男']    再根据第二部分的$fieldArr进行组装数据为:['name'=>'test','age'=>18,'sex'=>'男']    最后将这条数据插入$insert 数组
$currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表$allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号$allRow = $currentSheet->getHighestRow(); //取得一共有多少行$maxColumnNumber = Coordinate::columnIndexFromString($allColumn);$fields = [];for ($currentRow = 1; $currentRow <= 1; $currentRow++) {    for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {        $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();        $fields[] = $val;    }}for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {    $values = [];    for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {        $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();        $values[] = is_null($val) ? '' : $val;    }    $row = [];    $temp = array_combine($fields, $values);    foreach ($temp as $k => $v) {        if (isset($fieldArr[$k]) && $k !== '') {            $row[$fieldArr[$k]] = $v;        }    }    if ($row) {        $insert[] = $row;    }}

4、第四部分:插入数据库

    第三步生成的$insert 数组插入数据库
$this->model->saveAll($insert);

理解了导入的原理,你就可以再这过程中自行修改某些部分的内容。


希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部