应实际系统需求,需要对通过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代码