SQL-запросы в цикле PHP завершаются с ошибкой после n-й итерации

#javascript #php #jquery #mysql #sql

#javascript #php #jquery #mysql #sql

Вопрос:

Gus,

У меня есть код, который в основном копирует кучу записей в одну БД и копирует ее в другую. Мне нужно сделать это для многих записей, поэтому я создал массив с переменными, которые каждый раз изменяют запрос. Вот структура моего массива:

 $array = [
["Brent_Chart_1", $List_Brent_Chart_1],
["Brent_Chart_2", $List_Brent_Chart_2],
["Brent_Chart_3", $List_Brent_Chart_3],
  et..... ]
  

И вот цикл, который проходит через массив и выполняет SQL-запросы:

 foreach ($array as list($a, $b)) {
     $queryx = "
UPDATE `meetings_ss`
SET `".$a."`= (
    SELECT `Data`
    FROM `charts`
    WHERE `ID` = ".$b."
    )
ORDER BY `ID` DESC LIMIT 1;";

 mysql_query($queryx);
}
  

Проблема заключается в следующем: по какой-то причине первые девять записей копируются, как и ожидалось, а затем ничего не копируется из десятой. Я знаю, что нет проблем с именами переменных и т. Д., Как будто я начинаю цикл с десятой записи, я получаю ту же проблему: первые девять копируются, но затем происходит сбой на десятой.

Это наводит меня на мысль, что это проблема с памятью, или, возможно, это неправильный способ обработки нескольких SQL-запросов? Кто-нибудь может предложить причину, по которой это не удается?

Большое вам спасибо за ваше время.

Комментарии:

1. Сколько строк в вашем $array?

2. Здравствуйте, спасибо за ваше сообщение. Имеется 77 строк.

3. Ваш порядок и ограничение отсутствуют, если подзапрос..

4. Вы пытались распечатать результирующий запрос, а затем запустить его вручную с помощью sql-клиента?

5. Да — кроме того, ошибка повторяется, когда я начинаю с девятого значения. Запрос всегда завершается с ошибкой на девятой итерации, независимо от того, с чего я начинаю. Это проблема с памятью? Нужно ли мне освобождать какую-то память??

Ответ №1:

Ваш order by и limit отсутствуют в подзапросе .. предложение update не может иметь «order» или «limit» 🙂

Попробуйте изменить свой код следующим образом:

 foreach ($array as $row) {
  $queryx = 'UPDATE meetings_ss SET 
      ' . $row[0] . ' = (SELECT Data FROM charts
    WHERE ID = ' . $row[1] . ' ORDER BY ID DESC LIMIT 1)';

  mysql_query($queryx);
}
  

Комментарии:

1. Привет, Харди, я внедрил ваше изменение, и повторяется точно такая же проблема. Он завершается с ошибкой после девятого запроса и больше не копирует записи, как ожидалось.

2. Хорошо, вам на самом деле даже не нужен этот порядок или ОГРАНИЧЕНИЕ.. Я на 100% уверен, что ваша проблема вызвана вашими данными. Включите ведение журнала ошибок PHP и просмотр и проверьте ошибку .. или отладьте все сгенерированные предложения SQL перед их выполнением.

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

Ответ №2:

С кодом проблем нет. Проблема связана со структурой БД и последовательными SQL-запросами, которые в конечном итоге нарушают размер строки:

 #1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.