接着上一篇来继续往下完善,上一篇是实现从表格里把数据获取到显示出来,显示出来没有多大意义,需要把数据导入到数据库,然后在后台展现出来,才算是完整。
在网上看了些资料,关于导入到数据库的写法有很多种,大都是利用循环通过索引列个数来获取的,例如这样:
<?php
$result = array(array('你好','我好','她好','也好','很好','逗号')); //模拟
foreach ($result as $key1 =>$vlas ) {
$data['name'] = $vals[0],
.......
}
类似于上面的那种写法!
我也尝试的试了下,数据完美的进入到了数据库;但是总感觉哪里不对劲儿?....我创建了一个excel表,在里面添加了100个字段,按着上面的写法,我就需要写一百个索引字段...太恐怖了,如果再多呢(一般不会有这么多的,假设)不敢想...,接着我对着代码进行了一番思考:为什么就不能自动获取列中的数据呢?不管有多少字段,我不同关心,直接自动获取就行了,然后拼装SQL(获取使用框架)进行存入就OK了,这多方便呢! 想想都感觉很美......
经过一阵儿“苦思冥想”,想明白一个事儿——获取表中数据,其实就是行和列的关系,把这个关系搞明白了,代码自然就有了
思路:
1. 通过PHPEcxcel获取到表格中的数据,返回的是一个二维数组(这个是自己拼装的),第一维数组表示行数,第二维表示每个行里面的列数(也代表字段数)
2. 利用双循环(也许有更好的方法)外层循环循环行数,内层循环循环列数,行列是对应的
3. 当循环列数据的时候,数据的个数和字段个数同样也是对应的(在存入数据库的时候,只存数据,不需要表头)
4. 用一个变量,来接收每次循环的列数据(用于最后的sql拼装)
代码如下:
<?php
//链接数据库
$coon = new mysqli('localhost','root','xxxxxx','test');
if ($coon->connect_error) echo 'not connect mysqli databases';
$coon->query("sets utf8");
//引入函数文件
include "./functions.php";
$files = empty($_FILES['excel']) ? '' : $_FILES['excel'];
//判断是否是有效的数据
if ($files && is_array($files) ) {
$ext = pathInfo($files['name'], PATHINFO_EXTENSION);
if ($ext === 'xlsx' || $ext === 'xls' ) {
//执行函数,从表格里读取到数据返回来结果
$result = ToLeadExcel( $files['tmp_name']);
if ( $result && is_array($result ) ) {
/**
* @这一步的目的是为了防止多条数据插入时,执行多次sql语句
* @这里也可以改写成用预处理来做
*/
$sql = "insert into test values";
/**
* 理解行和列的关系
* @第一个循环循环最外面的行数
* @第二个循环循环行里面的列
* @每次循环列的时候,把每个列数据拼装,并保存到一个变量里
* @当内部列循环完以后,对变量里的数据进行sql的拼装,依次循环
* @最后:有多少行就拼装多少次,最后执行一次sql语句就行了
* @这一步也可以做个判断,当数据达到多少时,执行一次sql
*/
foreach ($result as $key1 => $res) {
/**
* @ param $conn_str
* @ conn_str是对列数进行拼装
* @ 每次列数据执行完毕后,清空$conn_str变量里的数据
* @ 目的是为了防止每次的数据进行叠加
* @ 也是为了保证每次行循环时,都是当前列的数据
*/
$conn_str = '';
if($key1 !== 1 ) { //这一层判断是为了剔除表格头
foreach ($res as $key2 => $res_res) {
if ( !empty($res_res)){
$conn_str .= ",'$res_res'";
}
}
$sql .= '(null,' .ltrim($conn_str, ','). '),';
}
}
}
/**
* 最后对插入数据结果进行判断
* return true or false
*/
$if_result = $coon->query(rtrim($sql, ','));
if ($if_result) {
echo '添加成功';
} else {
echo '添加失败';
}
}
}
使用框架的批量插入:
1. TP3.2可以考虑使用 addAll()方法
2. yii2.0批量插入数据可以如下写:
Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [
['test01', 30],
['test02', 20],
['test03', 25],
])->execute();
相互学习,相互交流,有更好实现方法的朋友请留言!