我有csv文件解析数组并传递给mysql表。 一些CSV文件不包含数据库中的一些列,当我将其转换为数组时,我的表中列数较少,我得到“语法错误”。
来自控制器我打电话:
function sendHistoric(){
$this->load->model('Historic_model');
$this->load->library('csvreader');
foreach($this->divisions as $div){
$result = $this->csvreader->parse_file("assets/csv/1516{$div}.csv");//path to csv file
$this->Historic_model->loadCSVtoDB($result);
//var_dump($result);
}
}
在模特中我有:
function loadCSVtoDB($data){
$sql = "call ins_historic(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
foreach($data as $row){
var_dump($row);
$this->db->query($sql,$row);
}
//echo $this->db->conn_id->error_message();
}
我可以以某种方式发送 NULL ,而不是他发现我的数据数量较少,或者我需要检查数组的每个元素是否存在,如果没有,则将其设置为null?
答案 0 :(得分:1)
要考虑的一个选择是不要编写较慢的PHP循环,而是利用LOAD DATA INFILE
块中的灵活代码可能性,例如此答案链接here中的处理。功能,转换可能是无止境的。
也许六分之一,六分之一。但对于更简单的例程也很好,我建议快速数据摄取。
修改(根据以下OP评论)
create table t62
( c1 int not null,
c2 varchar(10) not null,
c3 int not null,
c4 char(5) not null,
someOther int not null,
-- an addtion 57 columns here
primary key(c1,c2,c3,c4)
);
-- Mimic the LOAD DATA INFILE or PHP loop:
insert t62(c1,c2,c3,c4,someOther) values (1,'t',1,'01742',777);
insert t62(c1,c2,c3,c4,someOther) values (1,'t',1,'01742',777); -- error 1062: Dupe PK
insert t62(c1,c2,c3,c4,someOther) values (1,'t',2,'01742',777); -- happy
所以我不知道,您会如何建议代码为您挑选复合PK?如果是这样,那些补偿数据如何与其他数据的关系发挥作用?