php 将csv文件内容导入数据库时值为空的解决

背景:和第三方服务商协调检测数据的时候,从他们后台导出了存放数据的csv文件。于是,需要将该文件内的数据导入到自己的mysql库中,写了一段代码如下:
// 将csv文件数据插入到mysql数据库中
if(file_exists(ROOT_PATH.'data.csv')){
    set_time_limit(0);
    $i = 0;
    $file = fopen(ROOT_PATH.'data.csv','r');
    while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容
        if ($i > 0){
            $obj = explode("	", $data[0]);// 以制表符切割内容(一个tab键)
            $email = $obj[0];
            /*$encode = mb_detect_encoding($obj[0],array("ASCII","UTF-8","GB2312","GBK","BIG5")); 
            $email = iconv($encode,"UTF-8",$obj[0]);
            $encode = mb_detect_encoding($email,array("ASCII","UTF-8","GB2312","GBK","BIG5"));*/
            
            $sql = "insert into EMDA_20140331(email) 
                    values('{$email}')";
	        $db->exec ( $sql );
        }
        $i ++;
    }
    fclose($file);
}
echo "finish!";exit;

直接运行这段代码后,发现mysql中的表有增加记录数,但是email字段全部都没有值。于是打印了运行的sql语句,放到navicat中执行,发现是可以运行的。思前想后的开始以为是$db->exec()封装的方法有问题,于是,直接手写了一个insert的sql。调用封装方法运行,数据库中值存了进去,开始想是不是插入时值有问题。接着又用php的addslashes()函数将插入值编译后再运行,发现还是不行。只好谷歌百度了,看到有人说会不会是字符编码的问题,感觉很像就用字符检查函数尝试对值进行检测。这时,问题果然出现了,mysql里的字符编码是UTF-8,可检测到字段的编码是ASCII。不得不说声坑啊,之后尝试用字符转码函数iconv想将ASCII转成UTF-8,发现转换不了。继续谷歌百度后,发现想转换需要自己写方法,感觉没那个必要(有兴趣的朋友可以继续研究),果断用最原始的方法用记事本打开那个见鬼的data.csv文件,然后另存为UTF-8格式,重新运行程序,数据正常插入一切OK了。

备注:编码检测函数和编码转换函数都在上面的代码内。

另外需要提醒的是,当我们需要将外部的csv数据源导入到数据库中的时候,最好是可以先看下文件的保存编码。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值