Dr.Freddy Опубликовано 6 Сентября 2005 Жалоба Поделиться Опубликовано 6 Сентября 2005 В скрипте во многих местах формируется одинаковый, довольно большой sql-запрос. Он составляет из множества конструкций UPDATE, DELETE и т.п. Запрос формируется с помощью cache_add_query и выполняет в конце cache_exec_query. Всё бы хорошо, но mysql не переваривает того, что IPB в итоге ей пытается скормить. Попытки разделять запросы пробелами/точкой с запятой/символов перевода строки не помогают. Таким образом, хочу получить реализацию:$DB->cache_add_query( ... ); $DB->cache_add_query( ... ); $DB->cache_add_query( ... ); $DB->cache_exec_query();Это возможно или придётся после каждого cache_add_query делать cache_exec_query? Нелогично как-то.[1125991911:1125999690]В общем, поэкспериментировал и пришёл к грустному выводу, что через PHP одной пачкой несколько запросов вообще никак не отправить Странно, что IPS не предусмотрела возможность «накапливать» запросы, а потом их парсировать и по одному выполнять. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 6 Сентября 2005 Жалоба Поделиться Опубликовано 6 Сентября 2005 А причём тут IPS ?Запросы выполняет не IPS, а MySQL. И php здесь кстати, тоже не причём. Он выполняет только роль передающего звена. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 6 Сентября 2005 Жалоба Поделиться Опубликовано 6 Сентября 2005 версия форума какая? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Dr.Freddy Опубликовано 7 Сентября 2005 Автор Жалоба Поделиться Опубликовано 7 Сентября 2005 Song, а причём тут mySQL? Насколько я понимаю, ни одна СУБД не выполняет несколько запросов в рамках одного пакета. Соответственно, разработчику нужно накапливать запросы в каком-нибудь массиве и выполнять по одному. Или накапливать в переменной, парсировать и опять-таки выполнять по одному. Покопался в драйвере IPS (GiV — версия форума 2.0.4). Вывод: cache_add_query() просто плюсует передаваемый ей запрос к cur_query, cache_exec_query() / cache_shutdown_exec() — вызывает simple_exec(), а тот, с свою очередь — query(). В ней:$this->query_id = [b]mysql_query[/b]($the_query, $this->connection_id);Механизма накопления запросов не вижу. Если проглядел — поправьте, пожалуйста. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 7 Сентября 2005 Жалоба Поделиться Опубликовано 7 Сентября 2005 Для создании цепочки запросов, выполняющихся единым блоком при окончании работы скрипта необходимо использоватьcache_shutdown_exec(); cache_add_query(); используется для выполнения запросов из классов sql комманд (./sources/sql/*) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Dr.Freddy Опубликовано 7 Сентября 2005 Автор Жалоба Поделиться Опубликовано 7 Сентября 2005 Ясно. Нет, по «окончанию работы» тут не совсем подходит. Но за подсказку спасибо. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 7 Сентября 2005 Жалоба Поделиться Опубликовано 7 Сентября 2005 а.. так проблема в том, что IPS передаёт запросы на исполнение в виде "запрос_1;запрос_2;запрос_3" и т.д. ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Dr.Freddy Опубликовано 8 Сентября 2005 Автор Жалоба Поделиться Опубликовано 8 Сентября 2005 Да, так. Причём, в одном пакете и без каких-либо разделителей. Хотя последнее неважно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 8 Сентября 2005 Жалоба Поделиться Опубликовано 8 Сентября 2005 Ну так только по одному.cache_shutdown_exec() мне кажется их тоже по одному выполняет, просто последовательно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
NikolayV Опубликовано 10 Сентября 2005 Жалоба Поделиться Опубликовано 10 Сентября 2005 Можно сделать запрос в запросе, но будет "левая" информация, проще по одному отправлять. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.