试图通过PHP将15k行CSV导入SQL,但每次只能导入600-900行

试图通过PHP将15k行CSV导入SQL,但每次只能导入600-900行,php,sql,csv,Php,Sql,Csv,这是我的第一篇帖子,我为我的错误提前道歉 我试图通过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

这是我的第一篇帖子,我为我的错误提前道歉

我试图通过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);  
      }
    }
?>

在循环开始时,在
之前添加以下代码行:

设置时间限制(300)


它会将执行查询的时间限制设置为
开始之前的5分钟(300秒)

循环开始时,添加以下代码行:

设置时间限制(300)


它会将执行查询的时间限制设置为5分钟(300秒)

在调用
fopen

ini_set('auto_detect_line_endings',TRUE);
参见gmail.com上的james dot ellis对

可能您的行尾由不同的操作系统进行不同的编码。例如,Windows将是
\r\n
,而基于Unix的系统使用
\n

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

Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
迭代2:

[0] => Giving
[1] => Up
[2] => On
然而,如果它没有正确地检测到结束行字符,则会导致两行连接在一起。然后,该行将被解析为包含6个元素的$getData数组。脚本只将位置0、1和2写入SQL插入脚本,将忽略最后三个位置

迭代1:

[0] => Say
[1] => Something
[2] => Im
[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)
[0]=>说
[1] =>什么
[2] =>即时通讯
[3] =>给予(忽略)
[4] =>向上(忽略)
[5] =>打开(忽略)
最后,如果要在插入代码中附加未经验证的字符串,则可能希望避免编写SQL代码。这很危险,而且很容易受到注射攻击。强烈建议您考虑使用准备好的语句,这些语句如下所示:

$stmt = mysqli_prepare($sql); $stmt->bind_param($getData[0], $getData[1],$getData[2]); $sql = "INSERT into testimport() values (?,?,?)"; $stmt=mysqli\u prepare($sql); $stmt->bind_param($getData[0]、$getData[1]、$getData[2]); $sql=“插入testimport()值(?,,?)”;
有关更多信息,请参阅。

在调用
fopen

ini_set('auto_detect_line_endings',TRUE);
参见gmail.com上的james dot ellis对

可能您的行尾由不同的操作系统进行不同的编码。例如,Windows将是
\r\n
,而基于Unix的系统使用
\n

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

Say,Something,Im<NEW_LINE_CHAR>
Giving,Up,On<NEW_LINE_CHAR>
迭代2:

[0] => Giving
[1] => Up
[2] => On
然而,如果它没有正确地检测到结束行字符,则会导致两行连接在一起。然后,该行将被解析为包含6个元素的$getData数组。脚本只将位置0、1和2写入SQL插入脚本,将忽略最后三个位置

迭代1:

[0] => Say
[1] => Something
[2] => Im
[0] => Say
[1] => Something
[2] => Im<NEW_LINE_CHAR>
[3] => Giving (Ignored)
[4] => Up (Ignored)
[5] => On<NEW_LINE_CHAR>(Ignored)
[0]=>说
[1] =>什么
[2] =>即时通讯
[3] =>给予(忽略)
[4] =>向上(忽略)
[5] =>打开(忽略)
最后,如果要在插入代码中附加未经验证的字符串,则可能希望避免编写SQL代码。这很危险,而且很容易受到注射攻击。强烈建议您考虑使用准备好的语句,这些语句如下所示:

$stmt = mysqli_prepare($sql); $stmt->bind_param($getData[0], $getData[1],$getData[2]); $sql = "INSERT into testimport() values (?,?,?)"; $stmt=mysqli\u prepare($sql); $stmt->bind_param($getData[0]、$getData[1]、$getData[2]); $sql=“插入testimport()值(?,,?)”;
有关更多信息,请参阅。

感谢您的帮助@dexter和@Daryl

我结合了你的建议,这个过程现在运行得非常完美

我可以在28秒内导入41列的15k记录,在60秒内导入30k记录!太神了现在,我需要将其自动化,但这是另一个难题:-)

这是我的最终代码:

include('dbconnect.php');

if(isset($_POST["Import"]))
{
     $filename=$_FILES["file"]["tmp_name"];    
     if($_FILES["file"]["size"] > 0)
     {
        ini_set('auto_detect_line_endings',TRUE); 
        $file = fopen($filename, "r");

          set_time_limit (45);
          while ($getData = fgetcsv($file, 0, ',', '"'))
           {
              $sql = "INSERT INTO testimport 
                    ( 
                      id_record,panel_number,machine_number,id_internal_code,
                      id_number,tot_production,waiting_time,operation_length,
                      avg_flow,max_flow,flow_15,flow_30,flow_60,flow_120,
                      avg_temp,max_temp,avg_cond,max_cond,m_detach,m_input,
                      m_quantity,m_input_nc,max_time,m_operation,m_sep_,
                      a_no_flow,a_conductivity,a_low_prod,a_kick_off,
                      a_temperature,prod_2min,low_flow_time,
                      50char_graph_data,data_enter,data_start,data_end,
                      data_exit,preparation_time,nr_session,perc_2min,
                      perc_low_flow
                    ) 

                    VALUES 
                     (
                        ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
                        ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
                     )"; 

                   $stmt = mysqli_prepare($conn, $sql);

                   $stmt->bind_param
                   (    "sssssssssssssssssssssssssssssssssssssssss",
                        $getData[0],  $getData[1],  $getData[2],  $getData[3], 
                        $getData[4],  $getData[5],  $getData[6],  $getData[7],  
                        $getData[8],  $getData[9],  $getData[10], $getData[11], 
                        $getData[12], $getData[13], $getData[14], $getData[15], 
                        $getData[16], $getData[17], $getData[18], $getData[19],
                        $getData[20], $getData[21], $getData[22], $getData[23], 
                        $getData[24], $getData[25], $getData[26], $getData[27], 
                        $getData[28], $getData[29], $getData[30], $getData[31], 
                        $getData[32], $getData[33], $getData[34], $getData[35], 
                        $getData[36], $getData[37], $getData[38], $getData[39],
                        $getData[40]
                   );

                   $sql = "INSERT into testimport() 
                   values 
                   (
                      ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
                      ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
                    )";

               $stmt->execute();
           }

        fclose($file);  
        mysqli_close($conn);
     }
}

谢谢你的帮助@dexter和@Daryl

我结合了你的建议,这个过程现在运行得非常完美

我可以在28秒内导入41列的15k记录,在60秒内导入30k记录!太神了现在,我需要将其自动化,但这是另一个难题:-)

这是我的最终代码:

include('dbconnect.php');

if(isset($_POST["Import"]))
{
     $filename=$_FILES["file"]["tmp_name"];    
     if($_FILES["file"]["size"] > 0)
     {
        ini_set('auto_detect_line_endings',TRUE); 
        $file = fopen($filename, "r");

          set_time_limit (45);
          while ($getData = fgetcsv($file, 0, ',', '"'))
           {
              $sql = "INSERT INTO testimport 
                    ( 
                      id_record,panel_number,machine_number,id_internal_code,
                      id_number,tot_production,waiting_time,operation_length,
                      avg_flow,max_flow,flow_15,flow_30,flow_60,flow_120,
                      avg_temp,max_temp,avg_cond,max_cond,m_detach,m_input,
                      m_quantity,m_input_nc,max_time,m_operation,m_sep_,
                      a_no_flow,a_conductivity,a_low_prod,a_kick_off,
                      a_temperature,prod_2min,low_flow_time,
                      50char_graph_data,data_enter,data_start,data_end,
                      data_exit,preparation_time,nr_session,perc_2min,
                      perc_low_flow
                    ) 

                    VALUES 
                     (
                        ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
                        ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
                     )"; 

                   $stmt = mysqli_prepare($conn, $sql);

                   $stmt->bind_param
                   (    "sssssssssssssssssssssssssssssssssssssssss",
                        $getData[0],  $getData[1],  $getData[2],  $getData[3], 
                        $getData[4],  $getData[5],  $getData[6],  $getData[7],  
                        $getData[8],  $getData[9],  $getData[10], $getData[11], 
                        $getData[12], $getData[13], $getData[14], $getData[15], 
                        $getData[16], $getData[17], $getData[18], $getData[19],
                        $getData[20], $getData[21], $getData[22], $getData[23], 
                        $getData[24], $getData[25], $getData[26], $getData[27], 
                        $getData[28], $getData[29], $getData[30], $getData[31], 
                        $getData[32], $getData[33], $getData[34], $getData[35], 
                        $getData[36], $getData[37], $getData[38], $getData[39],
                        $getData[40]
                   );

                   $sql = "INSERT into testimport() 
                   values 
                   (
                      ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,
                      ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
                    )";

               $stmt->execute();
           }

        fclose($file);  
        mysqli_close($conn);
     }
}

感谢Dexter,我增加了设置时间限制,现在它在前20-30秒内上传8200到8400行,但随后它停止了。即使我设置了300秒或600秒的时间限制,我总是能导入最多8400行,这比昨天要好得多:-),但仍然不能导入存储在csv文件中的15k行。fgetcsv()函数工作得很好,我可以回显所有15k行并对所有41列执行数学运算,但我仍然没有成功地将它们一次全部导入到SQL表中……感谢Dexter,我添加了设置时间限制,现在它在前20-30秒内上载8200到8400行,但随后它停止了。即使我设置了300秒或600秒的时间限制,我总是能导入最多8400行,这比昨天要好得多:-),但仍然不能导入存储在csv文件中的15k行。fgetcsv()函数工作得很好,我可以回显所有15k行并对所有41列执行数学运算,但我仍然没有成功地将它们一次全部导入SQL表中…谢谢Daryl!在我的特定情况下,csv文件总是正确格式化,因为它是由另一台服务器自动生成的。我将您的建议的第二部分(绑定函数)与@dexter的建议(超时45秒)结合起来,然后。。。它有效!!:-)非常感谢你!!多么伟大的团队合作!!我将在下面发布为我工作的代码。谢谢Daryl!在我的特定情况下,csv文件总是正确格式化,因为它是由另一台服务器自动生成的。我将您的建议的第二部分(绑定函数)与@dexter的建议(超时45秒)结合起来,然后。。。它有效!!:-)非常感谢你!!多么伟大的团队合作!!我将在下面发布为我工作的代码。