0

我最近问过如何将 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's 和 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;
}
4

3 回答 3

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);
}

为了获得最大的兼容性和性能,我建议使用类似这个connect_PDO函数的函数连接到 PDO 。

于 2012-08-14T16:41:36.837 回答
0

首先,您只需要准备一次查询(这是使用准备好的语句的两个主要优点之一,另一个是防止注入),因此将调用放在循环prepare()之前while,而不是在循环内部。

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

于 2012-08-14T15:03:22.310 回答
0

问题在于 return 声明。删除退货立即解决了问题。

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

感谢大家对此的建议和帮助!

于 2012-08-14T20:07:27.207 回答