PHP-скрипт вставляет только 5000 строк в базу данных phpMyAdmin

62
3

У меня есть следующий скрипт, который я написал:

<?php

$filename = "readingDataFromThis.LOG";
$filterarray= array("stuff to remove from the file", "and more stuff");
if (file_exists($filename) && is_readable ($filename)) {
ini_set('memory_limit','16M');
ini_set('max_execution_time', 600);
$con=mysqli_connect("server","username","password","database_name");
$count = 0;

$fh = fopen($filename, "r");
if ($fh) {
while (($line = fgets($fh)) != false) {

if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if (strpos_arr($line, $filterarray) == false) {
$month = substr($line, 3,5);
$day = substr($line, 0,2);
$year = substr($line, 6,8);
$timestamp = substr($line, 9, 17);
$message = substr($line, 18);

mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')");
echo "Inserted record " . $count++ . "<br>";
}
}
}
fclose($fh);
mysqli_close($con);
echo "Complete.";
}

function strpos_arr($haystack, $needle) {
if(!is_array($needle)) $needle = array($needle);
foreach($needle as $what) {
if(($pos = strpos($haystack, $what))!==false) return $pos;
}
return false;
}
?>

Когда я запускаю его, у меня нет проблем, вывод, который я получаю на экране, по существу выглядит так:

Inserted record 0
Inserted record 1
...
Inserted record 14000+
Complete.

Однако, когда я иду в таблицу в самой базе данных, я нахожу, что ТОЛЬКО первые 5000 записей, вставленных в базу данных. Что здесь происходит?

спросил(а) 2014-08-28T06:55:00+04:00 6 лет, 10 месяцев назад
1
Решение
100

Работая с Barmar в ходе обсуждения, мы закончили модификацию следующих строк кода:

    $message = mysqli_real_escape_string($con,substr($line, 18));

Это по существу обрабатывает странные строки текста, которые имеют символы, такие как "в них, которые нарушают синтаксис для инструкции SQL INSERT.

    mysqli_query($con,"INSERT INTO Conversation (Month, Day, Year, Time, Message)
VALUES ('$month', '$day', '$year', '$timestamp', '$message')") or die(mysqli_error($con));

В этом блоке кода мы добавили или умереть (mysqli_error ($ con));

Это говорит программе прекратить выполнение и вывести ошибку о том, почему. Это дало мне следующую ошибку:

Пользователь "my_sa" превысил ресурс "max_updates" (текущее значение: 5000)

Я использую бесплатный веб-хост, поэтому на основе некоторых поисковых запросов Google мы определили, что это, скорее всего, проблема ограничения скорости и может быть решена путем запуска программ в итерациях для вставки раздела записей за раз.

ответил(а) 2014-08-28T07:58:00+04:00 6 лет, 10 месяцев назад
45

Возможно ли, что они дублируются на вашем ключе, таким образом, не вставлены или не обновляют предыдущие значения. Если это займет слишком много времени, это может быть просто тайм-аут. Однако у PHPMyAdmin есть функция, которая остановит выполнение, если время ожидания будет достигнуто, что также означает, что он позволит вам возобновить работу в нужном месте.

ответил(а) 2014-08-28T07:20:00+04:00 6 лет, 10 месяцев назад
45

Использование:

$message = mysqli_real_escape_string($con, substr($line, 18));

чтобы сообщение можно было правильно заменить в запросе. В противном случае, если $message содержит символ кавычки, вы получаете недействительный синтаксис SQL, когда он получает детализированный запрос.

Лучше перекодировать с помощью mysqli_prepare() и mysqli_stmt_bind_param().

ответил(а) 2014-08-28T07:13:00+04:00 6 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема