Ошибка 500 или кодировка содержимого при выполнении больших вставок MySQL из CSV

/ beginnote
Этот вопрос был помечен как «дубликат». Он отличается от упомянутого вопроса, потому что в моем приложении я не могу использовать LOAD IN, поскольку входной файл никогда не будет красиво отформатирован, поэтому я должен прочитать его построчно, чтобы проверить правильность записей.

Кроме того: в моем рабочем коде я изменил с mysql_ на mysqli, и у меня появляются те же симптомы.

Кроме того: мой хост-провайдер сказал мне, что ошибки браузера, которые я получаю (500 или ошибка кодировки контента), не будут отображаться в журнале сервера.

Я хотел бы снова открыть это и узнать, как устранить проблему.
/ сноска

Я получаю сообщение об ошибке при попытке вставить записи в MySQL из файла CSV в Firefox и Chrome. Файл CSV содержит 300 000 строк. Это будет либо «Страница, которую вы пытаетесь просмотреть, не может быть показана, потому что она использует недопустимую или неподдерживаемую форму сжатия». или просто ошибка 500.

Проблема в том, что буфер заполняется? Я пытался использовать ob_clean () и flush (), но это не сработало. Идеи?

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Process uploaded CSV file for Seatac Noise</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>

<?php
error_reporting(E_ALL);
//echo "<pre>" . PHP_EOL;
$database = "jch";
$user     = "jch";
$password = "password";
$connector = 'jch.55.com';
$link = mysql_connect($connector,$user,$password);
mysql_select_db($database) or die( "Unable to select database");
$filter = $_POST["filter"];
$uploaddir = '/uploads';

$path = $uploaddir  . $filter . basename($_FILES['ufile']['name']);

if($ufile != none)
{
if (move_uploaded_file($_FILES['ufile']['tmp_name'], $path)) {
echo "File is valid and was successfully uploaded.\n";

$row = 0;
if (($handle = fopen($path, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;

if( strlen($data[4]) > 0 )
{

$monitor_id = $data[1];
$time = date("Y-m-d H:i:s", strtotime($data[0]));

echo('<p>' . $time . ' rows processed: ' . $row . '</p>');

$noise_level = $data[2];
$flight_id = $data[4];
$aircraft_type = $data[3];

$query="INSERT INTO jch_noise_detail_copy (
monitor_id,
time,
noise_level,
flight_id,
aircraft_type)
VALUES(" .
"'" . $monitor_id . "','" .
$time . "'," .
$noise_level . ",'" .
$flight_id . "','" .
$aircraft_type . "')";

$result = mysql_query($query);
if( mysql_errno($link)!= 0 ){
echo $query . "\n";
echo mysql_errno($link) . ": " . mysql_error($link) . "\n"  ;
}
}

}  // end while
mysql_close();}

}
else
echo 'No Rows found matching this date or filter';
}
mysql_close();
fclose($handle);
?>
</body>
</html>

0

Решение

В этом коде вы вставляете 300 000 строк с 300 000 отдельных вставок. Каждый раз, когда mysql_query () создает отдельный вызов из php в mysql.

Вы можете оптимизировать его, используя массовые вставки — MySQL Reference

В конце запрос будет выглядеть так:

INSERT INTO jch_noise_detail_copy (
monitor_id,
time,
noise_level,
flight_id,
aircraft_type
) VALUES ($monitor_id_0, time_0 ...), ($monitor_id_1, time_1, ...), ..., ($monitor_id_N, time_N, ...);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]