首页 > 解决方案 > 尝试通过 PHP 将 15k 行 CSV 导入 SQL,但每次只导入 600-900 行

问题描述

这是我的第一篇文章,我提前为我的错误道歉......

我正在尝试通过 PHP 将 15k 行的 csv 文件导入 SQL,但每次只导入 600-900 行。

这是我的代码:

<?php
    if(isset($_POST["Import"]))
    {
     $filename=$_FILES["file"]["tmp_name"];    
     if($_FILES["file"]["size"] > 0)
      { 
        $file = fopen($filename, "r");
          while (($getData = fgetcsv($file, 0, ',', '"')) !== FALSE)
           {
             $sql = "INSERT into testimport() 
             values ('".$getData[0]."','".$getData[1]."','".$getData[2]."')";

              $result = mysqli_query($conn, $sql);

              if(!isset($result))
              {
                echo "<script type=\"text/javascript\">
                alert(\"Invalid File:Please Upload CSV File.\");
                window.location = \"readRecords.php\"
                </script>";    
              }
              else 
              {
                echo "<script type=\"text/javascript\">
                alert(\"CSV File has been successfully Imported.\");
                window.location = \"readRecords.php\"
                </script>";
              }
           }
        fclose($file);  
      }
    }
?>

非常感谢你的帮助!!乔治奥

标签: phpsqlcsv

解决方案


在调用之前添加以下行fopen

ini_set('auto_detect_line_endings',TRUE);

请参阅 gmail dot com 对https://www.php.net/manual/en/function.fgetcsv.php的评论中的 james dot ellis

您可能有不同操作系统以不同方式编码的行尾。例如,Windows 将\r\n在基于 Unix 的系统使用\n

这可能会导致某些行被连接在一起。例如,

Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>

如果 fgetcsv 正确捕获结束行字符,它将产生 $getData 的单独迭代,如下所示:

迭代 1:

[0] => Say
[1] => Something
[2] => Im

迭代 2:

[0] => Giving
[1] => Up
[2] => On

然而,如果它没有正确检测到结束符,您最终会将两行连接在一起。然后该行将被解析为具有 6 个元素的 $getData 数组。仅将位置 0,1 和 2 写入 SQL 插入脚本的脚本将忽略最后三个。

迭代 1:

[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)

最后,您可能希望避免编写将未经验证的字符串附加到插入代码的 SQL 代码。这是危险的,而且很容易受到注入攻击。强烈建议您考虑使用看起来像这样的准备好的语句:

    $stmt = mysqli_prepare($sql);
    $stmt->bind_param($getData[0], $getData[1],$getData[2]);
    $sql = "插入 testimport() 值 (?,?,?)";

有关详细信息,请参阅PHP:将值从表单插入 MySQL


推荐阅读