防攀爬系统——EXCEL导入数据库修改版

应实际系统需求,需要对通过EXCEL导入数据库的信息做“查重”处理,也就是每读取EXCEL表的一行数据与数据库进行一次比对,对重复出现的数据给出提示,只有全部不重复才可插入数据库。还有想到在读取EXCEL之前应该先判断一下是不是按照模版上的表头信息填写的,不是的话也不允许继续下去。

下午也犯了一个错误,本想根据read_excel()函数的返回值来判断是应该提示“导入成功”还是“不是模版”的。结果直接写成了下面的代码,fpp_13接下来的导入数据就在那纠结了,明明数据库中还没有该模块的信息啊,为什么还提示“模块已经存在”了呢?而且给出的是“200”,执行成功的意思。纠结啊,甚至在那把一步步执行的结果给echo出来,还是没有发现问题出在哪里。吃过晚饭,静下心来一步步查看,才发现就是那个if语句出现的问题,在else中又执行了一遍读取写入的过程,难怪不重复的信息也提示已经存在了。“一失足成千古纠结人物啊”,于是下午的两个小时宝贵时间就在“我到底错哪了”中度过了。

view中upload_excel.php页面是用户在点击“EXCEL批量导入”后显示的,给出了一些提示信息,先下载模版,按要求填写后上传。fpp_14在上传的时候我也做了一个模版信息的匹配,当时有两种想法,一个是直接根据表头的中文判断,但这有一个编码的问题;第二个是在表头之前加一个判断的字段,读取该字段看是否匹配,但这样EXCEL表头显示不太好看了,目前采用的办法是将第一行的验证字段隐藏掉,这样就只显示简单的提示信息了。验证字段不是按照数据表的列名来的,那样的话直接将数据库的列名显示了出来,也是不安全的。

导入EXCEL的过程中还学习了一下EXCEL的的保护,将表头等提示信息锁定不允许修改。具体的做法是划出范围后“锁定单元格”->”保护工作表”,设置好密码,这样EXCEL的那些信息就得到一定保障了。

之前的导入insert相关的语句都是自己写的,没有用CI框架自带的函数,也就是ixuyao自己去连数据库了,这样是很不安全的,因为mysql_connect()函数中将数据库的用户名密码都暴露了出来。今天改用框架的create()函数,但这只是插入一条数据,跟进create()函数后发现内部的insert语句,其中还有一个insert_banch()函数是批量插入的,但其实质上还是用循环实现的,并不是高效的一条insert插入多条数据。

最后附上新版的导入EXCEL代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
*读取excel文件并写入数据库
*/
public function read_excel($filename)
{
require_once ’/application/libraries/PHPExcel/excel_read2.php’;
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding(’gbk’);
$data->read("./application/upload/node_excel/".$filename);
//获取表头
$name_title = $data->sheets[0][’cells’][1][1];
$desc_title = $data->sheets[0][’cells’][1][2];
$SIM_title = $data->sheets[0][’cells’][1][3];
//判断表头信息是否为模版里的表头,不是的话返回提示
if(!($name_title == "fpp_1" && $desc_title == "fpp_2" && $SIM_title == "fpp_3"))
{
return -2;
}
//具体信息
$sql = "";
$flag_alert = 0;//只输出一句警告
for ($i = 4; $i <= $data->sheets[0][’numRows’]; $i++)
{
//检查重复
$name_content = $data->sheets[0][’cells’][$i][1];
$desc_content = $data->sheets[0][’cells’][$i][2];
$SIM_content = $data->sheets[0][’cells’][$i][3];
if($this->is_exists($this->tables[0], ’name’, $name_content)==true)
{
if($flag_alert == 0)
{
echo "部分模块已经存在,请修改后重新导入"."</br>";
}
$flag_alert = 1;
echo "第".$i."行&nbsp&nbsp&nbsp&nbsp&nbsp模块名称:".$name_content."已存在!"."</br>";
}
$sql .= "(’". $name_content."’,’". $desc_content."’,’" . $SIM_content."’),";
$data_db[$i][’name’] = $name_content;
$data_db[$i][’SIMnumb’] = $SIM_content;
//获取EXCEL中中文编码并转为UTF-8
$encode = mb_detect_encoding($desc_content, array("ASCII",’UTF-8’,"GB2312",’GBK’));
$data_db[$i][’desc’] = iconv($encode, "UTF-8", $desc_content);
}
if($flag_alert == 1)
{
return -1;
}
$sql = substr($sql,0,strlen($sql)-1);//去除最后一个逗号
$this->db->trans_start();
//$this->db->insert_batch($this->tables[0], $data_db);//CI批量插入函数,本质还是循环
foreach ($data_db as $k)
{
$this->create($this->tables[0], $k);
}
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE)
{
return $this->db_error;
}
else
{
$this->applog->msg(’导入成功’);
return 1;
}
}

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>