我从CSV文件中提取行,但在插入时,会跳过一些记录。解决方案是什么?
while(($line = fgetcsv($file, 10000, ",")) !== FALSE){
$total_data++;
$sql="SELECT id FROM customers WHERE id ='".$line[0]."'";
$db->query( $sql);
$check = $db->resultset();
$num = $db->rowCount();
if($num > 0){
$update_data++;
//$db->query("UPDATE customers SET name = :name, phone=:phone where id=:id");
$db->bind(':name', $line[1]);
$db->bind(':phone', $line[2]);
$db->bind(':id', $line[0]);
$db->execute();
}else{
$insert_data++;
$db->query("INSERT INTO customers(id,name,phone) VALUES (:id,:name,:phone)");
$db->bind(':id',$line[0]);
$db->bind(':name', $line[1]);
$db->bind(':phone', $line[2]);
$db->execute();
}
}
答案 0 :(得分:0)
通常使用PDO,您必须将调用结果存储到query()等,并在返回的预准备语句中调用方法...
query()会返回PDOStatement个对象,因此请将其保存在变量中,例如$statement
,然后在该变量上调用rowCount()之类的方法:
while(($line = fgetcsv($file, 10000, ",")) !== FALSE){
$total_data++;
$sql="SELECT id FROM customers WHERE id ='".$line[0]."'";
$statement = db->query( $sql);
$check = $statement->resultset();
$num = $statement->rowCount();
if($num > 0){
$update_data++;
$updateStatement = $db->query("UPDATE customers SET name = :name, phone=:phone where id=:id");
$updateStatement->bind(':name', $line[1]);
$updateStatement->bind(':phone', $line[2]);
$updateStatement->bind(':id', $line[0]);
$updateStatement->execute();
}else{
$insert_data++;
$insertStatement = db->query("INSERT INTO customers(id,name,phone) VALUES (:id,:name,:phone)");
$insertStatement->bind(':id',$line[0]);
$insertStatement->bind(':name', $line[1]);
$insertStatement->bind(':phone', $line[2]);
$insertStatement->execute();
}
}