Yii2中的CSV导入

时间:2015-07-02 05:20:17

标签: php mysql csv yii2

我做了什么?

我试图在我的项目模块中上传csv文件。下面给出了csv格式。在上传时获取错误消息" 1行有验证错误"。 这些值未插入db。

我想要什么?

我想在我的mysql数据库中上传我的csv文件数据。

$phone_no = $_GET['phone_no'];

插入查询Mysql

      **My CSV Format**
==============================================================================
model_name|imei_no|promoter_vendor_id|device_report_id|allocation_date
==============================================================================
sam       | 2342  |     7            |   3             |2015
==============================================================================

模型导入功能

INSERT INTO `dbname`.`tbl_device`
(`device_id`,`model_name`,`imei_no`,`promoter_vendor_id`,`device_report_id`,
`allocation_date`,`inserted_date`,`inserted_ip`,`inserted_by`,`updated_date`,
`updated_ip`,`updated_by`,`status_in`,`record_status`)VALUES
(Auto_inc,sam,34234,7,3,2015,?,?,?,?,?,?,?,?);

我的浏览页面

In model i am trying to create insert query in yii model.

function device_insert_by_csvfile()
{
/* Table name*/
    $table='tbl_device'; 
    $row = 1;
    $field='';
    $value='';
    $success=0;
    $error=0;
    //Check the file available or not

    if(file_exists('device_csv.csv')){
    $handle = fopen('device_csv.csv', "r");
        $valueComa='';
    $model_name=$imei_no=$promoter_vendor_id=$device_report_id=$allocation_date=-1;

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
     {
    $num = count($data);echo "<script>alert(".$num.");</script>";
        // Skip Validate Error Row
        if( $row !=1 && (trim($data[$model_name])=='' ||      trim($data[$imei_no])=='' || trim($data[$promoter_vendor_id])=='' || trim($data[$device_report_id]) || trim($data[$allocation_date]) =='')){
                  $error++;
                    continue;
          }

          // Table Fields Binding
            if($row ==1){ 
                $coma='';
                for ($c=0; $c < $num; $c++) {
                    if(trim($data[$c])=='model_name'){
                        $model_name=$c;
                    }
                    if(trim($data[$c])=='imei_no'){
                        $imei_no=$c;
                    }
                    if(trim($data[$c])=='promoter_vendor_id'){
                        $promoter_vendor_id=$c;
                    }
                    if(trim($data[$c])=='device_report_id'){
                        $device_report_id=$c;
                    }
                    if(trim($data[$c])=='allocation_date'){
                        $allocation_date=$c;
                    }
                    $field.= $coma.trim($data[$c]);
                    $coma=',';
                }
            }
            //Values Binding
            else{
                // Successfully Inserted Row Count
                $success++;
                $totId++;
                // Insert record value Binding
                $value.=$valueComa."(";
                $vcoma='';
                for ($c=0; $c < $num; $c++) {
                    if($promoter_vendor_id ==$c &&  trim($data[$c]) !=''){

                        $ftype=UserType::find()->where("id='$data[$c]' OR type               like'%$data[$c]%'")->asArray()->one(); 
                        if(count($ftype) >0){
                            $value.=$vcoma."'".$ftype['id']."'" ;
                            $vcoma=',';
                        }else{
                            $value.=$vcoma."'0'" ;
                            $vcoma=',';
                        }                   
                    }else{
                        $value.=$vcoma."'".addslashes(trim($data[$c]))."'" ;
                        $vcoma=',';
                    }

                }
               $value.=")";
               $valueComa=',';
            }
              $row++;
        }
        fclose($handle);
        unlink('device_csv.csv');
    if($value !=''){    
            $sql ="insert into $table ($field) values $value";
            $connection = \Yii::$app->db;
            $command=$connection->createCommand($sql);
            $dataReader=$command->execute();
        }
    }
    return array($success,$error);
    }

2 个答案:

答案 0 :(得分:1)

您可以使用供应商的库。例如:https://github.com/ruskid/yii2-csv-importer

答案 1 :(得分:0)

根据您发布的MySQL查询,sam

附近缺少引号
INSERT INTO `dbname`.`tbl_device` 
(`device_id`, `model_name`, `imei_no`, `promoter_vendor_id`,
`device_report_id`, `allocation_date`, `inserted_date`,
`inserted_ip`, `inserted_by`, `updated_date`, `updated_ip`,
`updated_by`, `status_in`,`record_status`)
VALUES (Auto_inc, 'sam', 34234, 7,3,2015,?,?,?,?,?,?,?,?);

在解析csv行期间,您应该创建一个数组$ string来标记$string[0]=true;(0是model_name列的索引),然后在$string[$c] === true的第二个循环中添加引号。我没有复制/粘贴解决方案,这里有很多代码可以改变2 ou 3行。

希望它有所帮助。