【问题标题】:CSV PDO Insert Loop?CSV PDO 插入循环?
【发布时间】:2023-03-10 08:01:01
【问题描述】:

我最近询问了如何将 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;
}

【问题讨论】:

  • 这个循环如何多次运行?你有一个return语句。

标签: php loops csv upload pdo


【解决方案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。

【讨论】:

    【解决方案2】:

    首先,您只需要准备一次查询(这是使用准备好的语句的两个主要优点之一,另一个是防止注入),所以在while 之前调用prepare()循环,不在里面。

    除此之外,我认为您发布的代码不会像您声称的那样运行,除非您的数据在 CSV 文件中重复。

    【讨论】:

      【解决方案3】:

      问题在于 return 语句。删除退货立即解决了问题。

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

      感谢大家的建议和帮助!

      【讨论】:

        猜你喜欢
        • 2016-03-27
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 2018-05-21
        • 2016-02-02
        • 2013-04-22
        • 1970-01-01
        相关资源
        最近更新 更多