пытаюсь импортировать 15 000 строк CSV в SQL через PHP, но каждый раз импортируется только 600-900 строк - PullRequest
1 голос
/ 20 апреля 2020

Это мой первый пост, я заранее извиняюсь за свои ошибки ...

Я пытаюсь импортировать CSV-файл с 15k строками в SQL через PHP, но получаю только 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);  
      }
    }
?>

Большое спасибо за вашу помощь !! Giorgio

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Добавьте следующую строку, прежде чем позвонить fopen

ini_set('auto_detect_line_endings',TRUE);

См. Комментарий Джеймса Дот Эллиса в gmail dot com по адресу https://www.php.net/manual/en/function.fgetcsv.php

Возможно что у вас могут быть окончания строк, которые по-разному кодируются другой ОС. Например, 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

Принимая во внимание, что если бы он не обнаружил символ конца строки правильно, вы в конечном итоге конкатенировали обе строки вместе. Затем строка будет проанализирована в массиве $ getData с 6 элементами. Последние три будут игнорироваться скриптом, который записывает только позиции 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 = "INSERT into testimport() values (?,?,?)";

См. PHP: вставка значений из формы в MySQL для получения дополнительной информации.

0 голосов
/ 20 апреля 2020

Спасибо за вашу помощь @dexter и @Daryl!

Я объединил ваши рекомендации, и теперь процесс работает отлично!

Я могу импортировать 15 тысяч записей из 41 столбца за 28 секунд и 30 тысяч записей за 60 секунд! Удивительно! Теперь мне нужно автоматизировать это, но это другая проблема :-)

Это мой окончательный код:

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);
     }
}
0 голосов
/ 20 апреля 2020

Перед началом while l oop добавьте следующую строку кода:

set_time_limit (300)

установит ограничение времени выполнения запроса до 5 минут (300 секунд)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...