2012-08-14 66 views
0

我最近问过如何将CSV插入MySQL数据库。有人建议我使用LOAD DATA LOCAL INFILE,但事实证明,这是在我的主机上禁用,所以不再是一个选项。回到PHP循环..CSV PDO插入循环?

我有一个问题循环通过临时上传的结果,因为我将值映射到插入数组。因此,在多行上,这将导致输入两次相同的条目(第一行的值),因为数组值是明确定义的。

它插入1,2,3,4,然后是1,2,3,4。我想插入1,2,3,4然后插入数组5,6,7,8。

什么解决方案(除了hacky for和row ++)?

在此先感谢。

$handle = fopen($_FILES['csv']['tmp_name'], "r"); 
$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)"; 

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
$query = $db->prepare($sql); 
if ($query->execute(array($data[0],$data[1],$data[2],$data[3]))) return true; 
    else return false; 
} 
+0

这个循环如何运行多次?你在那里有一个return语句。 – 2012-08-14 16:08:39

回答

0

首先,你只需要一次准备查询(这是使用预处理语句的两个主要优点之一,注射预防是另一种),所以while之前把呼叫prepare()循环,不在里面。

除此之外,我发现没有理由说明您发布的代码会按照您声称的方式行事,除非您的数据在CSV文件中重复。

1

我能想到的唯一的事情是你的循环只执行一次,但是你运行循环两次。 (您的循环中的“回报”的声明。)

下面应该工作:

function loadCsv($db, $filename){ 

    $fp = fopen($filename, 'rb'); 
    $sql = 'INSERT INTO tbl (col1, col2, col3, col4) VALUES (?,?,?,?)'; 
    $pstmt = $db->prepare($sql); 

    while (FALSE !== ($data = fgetcsv($fp, 1000))) { 
     $cols = array_slice($data, 0, 4); 
     $query->execute($cols); 
    } 

    $pstmt->closeCursor(); 
    fclose($fp); 
} 

为了获得最大的兼容性和性能,我建议用连接像this connect_PDO function函数生成PDO。

0

问题出在return语句。删除回报立即解决问题。

不幸的是发布此答案的用户已将其删除。

感谢大家的建议和帮助!