我试图在我的项目模块中上传csv文件。下面给出了csv格式。在上传时获取错误消息" 1行有验证错误"。 这些值未插入db。
我想在我的mysql数据库中上传我的csv文件数据。
$phone_no = $_GET['phone_no'];
**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);
}
答案 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行。
希望它有所帮助。