Ошибка MySQL при загрузке большого набора данных CSV - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть фрагмент кода ниже, который отлично работает, когда я пытаюсь загрузить CSV-файл с относительно небольшими (~ 500) записями. Однако, когда записи становятся больше (я пробовал 20 000), это вызывает следующую ошибку.

У вас есть ошибка в вашем синтаксисе sql. Проверьте руководство, соответствующее вашей версии сервера mysql, чтобы узнать правильный синтаксис для использования рядом с 'S FANCY-KNDY0046', '1298', '32321', 'QE4224', '2' ) 'в строке 1

Мой INSERT into выглядит следующим образом: (На самом деле пока не думал о том, чтобы очистить входные данные, но ваши мысли тоже пригодятся!)

if($_FILES["file"]["size"] > 0)
     {
        $file = fopen($filename, "r");
         while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE)
         {
           $sql = "INSERT into universe (`zone`, `area`, `sub`) values('$emapData[0]','$emapData[1]','$emapData[2]')";

$result = mysqli_query($conn, $sql);
                if(!$result )
                {
                    echo "ERROR:". mysqli_error($conn); // I included this to see the error message.
                    echo "<script type=\"text/javascript\">
                            alert(\"Invalid File:Please Upload CSV File.\");
                            window.location = \"index.php\"
                        </script>";
            }
         }
         fclose($file);
         echo "<script type=\"text/javascript\">
                    alert(\"CSV File has been successfully Imported.\");
                    window.location = \"index.php\"
                </script>"; 
        mysqli_close($conn); 
     }

Цените, если кто-то может указать мне, если я здесь что-то не так делаю! Спасибо.

1 Ответ

0 голосов
/ 01 сентября 2018

Проще говоря, у вас есть ' в строке, с которой вы заключаете '', и поэтому строка рано разбивается и вызывает синтаксическую ошибку.

Если бы вы использовали параметризованные запросы, это не оказало бы никакого влияния на запрос, и вы бы защитились от Атаки SQL-инъекций

if($_FILES["file"]["size"] > 0) {
    $file = fopen($filename, "r");

    // prepare the query once and reuse lots of times
    // reduces load on the server as well as the database
    // only has to compile and optimize the query once
    $sql = "INSERT into universe (`zone`, `area`, `sub`) 
            VALUES(?,?,?)";
    $stmt = $conn->prepare($sql);

    while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE) {
        $stmt->bind_param('sss', $emapData[0], $emapData[1], $emapData[2]);

        $result = $stmt->execute();
        if(!$result ) {
            echo "ERROR:". $conn->error; // I included this to see the error message.
            echo "<script type=\"text/javascript\">
                  alert(\"Invalid File:Please Upload CSV File.\");
                  window.location = \"index.php\"
                  </script>";
        }
    }
    fclose($file);
    echo "<script type=\"text/javascript\">
          alert(\"CSV File has been successfully Imported.\");
          window.location = \"index.php\"
          </script>"; 
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...