CSV PDO插入循环?

时间:2012-08-14 14:56:03

标签: php loops csv upload pdo

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

我在循环上传临时上传的结果时出现问题,因为我正在将值映射到插入数组。因此,在多行上,这会导致相同的条目输入两次(第一行的值),因为显式定义了数组值。

它插入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;
}

3 个答案:

答案 0 :(得分:1)

我唯一能想到的是你的循环只执行一次,但你运行循环两次。 (循环中有一个“return”语句。)

以下内容应该有效:

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。

答案 1 :(得分:0)

首先,您只需要准备一次查询(这是使用预准备语句的两个主要优点之一,注入防护是另一个),因此在prepare()之前调用while {1}}循环,不在其中。

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

答案 2 :(得分:0)

问题在于return语句。立即删除回报修复了问题。

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

感谢大家的建议和帮助!