Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Возможно ли формировать мульти запросы в Opencart


Рекомендованные сообщения

Здравствуйте.
А в опенкарт вообще можно создать мульти запрос.
https://php.net/manual/ru/mysqli.quickstart.multiple-statement.php
 

А то у меня что то не получается. Если да то как ?
В файле /system/library/db/mysqli.php
Я не нашел упоминания об этом.

Ссылка на комментарий
Поделиться на других сайтах

В документации же указано, что 

$this->connection->query($sql)

в случае множественных запросов не выполнится из соображений безопасности. Для этого этого отдельно и ввели multi_query

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

8 минут назад, ozzzi сказал:

В документации же указано, что 


$this->connection->query($sql)

в случае множественных запросов не выполнится из соображений безопасности. Для этого этого отдельно и ввели multi_query

Я конечно извиняюсь, но судя по документации php нужно составить строку которая содержит много запросов разделенных точкой с запятой.
Это не проблема.
Затем нужно отправить через $this->connection->multi_query($sql);

так вот в рамках опенкарт нету такого метода. multi_query
И при попытке вызвать его получаем Fatal error: Uncaught Error: Call to undefined method DB::multi_query() in

Поскольку такого нету в библиотеке /system/library/db/mysqli.php
 

Спойлер

8UAUVov.png

Вот и суть вопроса. В опенкарт это возможно или нет ? И если да то как.

Ссылка на комментарий
Поделиться на других сайтах

4 минуты назад, Rassol2 сказал:

И если да то как.

 

5 минут назад, Rassol2 сказал:

так вот в рамках опенкарт нету такого метода. multi_query

так добавьте

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Какой тайный смысл?

Но можно и добавить методы как в либу, так и в адаптер

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Сами же все описали: метода нужного нет. Чтобы заработало нужно его добавить, иначе никак.

public function multi_query($sql) {
	$this->connection->multi_query($sql);
}

 

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

9 минут назад, fanatic сказал:

 

так добавьте

 

5 минут назад, ozzzi сказал:

Сами же все описали: метода нужного нет. Чтобы заработало нужно его добавить, иначе никак.


public function multi_query($sql) {
	$this->connection->multi_query($sql);
}

 

значит нету возможности. И нужно добавлять. А вмешивается в работу стандартных библиотек не особо хочется.
 

 

6 минут назад, chukcha сказал:

Какой тайный смысл?

Но можно и добавить методы как в либу, так и в адаптер

Тайных смыслов нету. Хочется поработать с данной функцией.
Есть необходимость массово записать много значений в таблицу. И что бы не использовать цикл с запросами хотел попробовать мульти запрос.

Буду думать всем кто отписался спасибо.

Ссылка на комментарий
Поделиться на других сайтах

6 минут назад, Rassol2 сказал:

Есть необходимость массово записать много значений в таблицу.

Так может сформировать массивы?

INSERT INTO table (id, name, value)
VALUES

(1,'name','value'),

(2,'name1','value2')

 

Ссылка на комментарий
Поделиться на других сайтах

1 минуту назад, chukcha сказал:

Так может сформировать массивы?

INSERT INTO table (id, name, value)
VALUES

(1,'name','value'),

(2,'name1','value2')

 

Да можно. Так и есть сейчас массив который по очереди выполняет запрос.

Но суть вот в чем.
Есть 80т ссылок. Которые нужно записать в базу данных. Причем нужно произвести перед записью проверку есть ли в базе такая ссылка.
По моим подсчетам получается нужно сделать переборку массива и на каждый элемент сделать проверку есть такая запись или нет. Если нет то записать.
Получается вместо 80т уже 160 + php 80т проверок if.

Вот я и подумал. Заменить сделать запрос INSERT INTO с проверкой. Что бы проверка была на уровне базы данных. Это сразу сократить с 160т до 80 необходимых запросов.
А ели у меня будет массив с запросами почему бы не обьеденить в один мульти запрос. И сократить количество соединений с базой.

Но это я так балуюсь, нужно же на чем то учится )))

Ссылка на комментарий
Поделиться на других сайтах

Это одноразовые работы, поэтому можно и по одному и в цикле
 

Ссылка на комментарий
Поделиться на других сайтах

1 минуту назад, chukcha сказал:

Это одноразовые работы, поэтому можно и по одному и в цикле
 

тут вы правы.
Но это и породила мой интерес к мульти запросам. Стало интересно поработать с этим. Вот и спросил.
Но теперь прицепи все ясно.
так что вопрос можно считать закрытым. Пойду играться дальше.

Ссылка на комментарий
Поделиться на других сайтах

12 часов назад, Rassol2 сказал:

По моим подсчетам получается нужно сделать переборку массива и на каждый элемент сделать проверку есть такая запись или нет. Если нет то записать.
Получается вместо 80т уже 160 + php 80т проверок if.

достаем ссылки из базы

фильтруем новые данные  и формируем values

добавляем

не?

 

Ссылка на комментарий
Поделиться на других сайтах

@fanatic Вот чего нет в адаптере - это сырого результата - или ссылки на курсор,
Для больших запросов  нужно самому пробегаться по курсору, а не получать объект с данными

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

2 часа назад, fanatic сказал:

достаем ссылки из базы

фильтруем новые данные  и формируем values

добавляем

не?

 

вы предлагаете потащить базу в которой почти 100 000ссылок.
Затем сравнить с массивом новых и записать обратно ?

Но иногда нужно сравнивать по 1800 ссылок за раз.
Хотя я подумаю может действительно такой вариант будет экономнее.

Ссылка на комментарий
Поделиться на других сайтах

2 часа назад, chukcha сказал:

@fanatic Вот чего нет в адаптере - это сырого результата - или ссылки на курсор,
Для больших запросов  нужно самому пробегаться по курсору, а не получать объект с данными

о да!

Ссылка на комментарий
Поделиться на других сайтах

3 часа назад, fanatic сказал:

достаем ссылки из базы

фильтруем новые данные  и формируем values

добавляем

не?

 

но у меня тогда есть еше вопрос.
А если в базе будет пол миллиона ссылок ?

Дергать такой массив для сравнения мне кажется не целесообразно.

Может вы знаете вариант запроса в БД который заменил бы вот такой код php

 

$count = $this->db->query("SELECT id FROM `" . DB_PREFIX . "pars_link` WHERE `link`='".$this->db->escape($link)."' AND `dn_id` =".(int)$dn_id." LIMIT 1");
if($count->num_rows == 0){
	$this->db->query("INSERT INTO `" . DB_PREFIX . "pars_link` SET `link` ='".$this->db->escape($link)."', `dn_id`=".(int)$dn_id);
}

Один запрос которые содержал бы условие, если нету тогда записать ?
Поле link и dn_id не уникальный ключ.

Ссылка на комментарий
Поделиться на других сайтах

3 часа назад, chukcha сказал:

Для больших запросов  нужно самому пробегаться по курсору, а не получать объект с данными

попробовал(локально)  

пол лимона база скушала.   два поля - коротенькое описание и ссылка

лимон не хочет

Ссылка на комментарий
Поделиться на других сайтах

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

 

Вроде в разы проще в реализации и по запросом меньше будет к БД.

1)Запрос на запись ссылок во временную таблицу;

2)Запрос на получение уникальных ссылок;

3)Записать эти ссылки в основную таблицу.

 

П.С. Если в чем-то ошибаюсь поправьте меня.

Ссылка на комментарий
Поделиться на других сайтах

8 минут назад, fanatic сказал:

пол лимона база скушала.   два поля - коротенькое описание и ссылка

лимон не хочет

Возможно ограничение на размер запроса

Ссылка на комментарий
Поделиться на других сайтах

12 минут назад, fanatic сказал:

попробовал(локально)  

пол лимона база скушала.   два поля - коротенькое описание и ссылка

лимон не хочет

Вот та конструкция что выше что я написал.
При получении массива на 1900ссылок а это поле обработки одной ссылки. Залазиет в базу за 19 секунд.
ZjkR9vF.png
а когда в очереди 45259ссылок это получается что для завершения. процесса нужно ждать всего ничего 10 дней непрерывно :)
 

12 минут назад, Bn174uk сказал:

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

 

Вроде в разы проще в реализации и по запросом меньше будет к БД.

1)Запрос на запись ссылок во временную таблицу;

2)Запрос на получение уникальных ссылок;

3)Записать эти ссылки в основную таблицу.

 

П.С. Если в чем-то ошибаюсь поправьте меня.

Идея тоже интересная.
Но система построена так что модуль кушает одну ссылку делает все дела. И цикл заканчивается.
А затем браузер в роли демона дергает повторно через ajax скрипт и все повторяется.

При таком подходе получается что временную таблицу нужно будет очищать после каждой ссылки.
и процесс будет таким.

Получили 1900 ссылок записали в временную базу в цикле по одной. Затем скопировали уникальные значения в постоянную базу.
Очистили временную базу.
И по новой.

Я новичке в программировании и не уверен что это оправдано. Нужен совет бывалых.

Ссылка на комментарий
Поделиться на других сайтах

7 минут назад, Yesvik сказал:

Сделай уник и тогда появится много вариантов...

тоже да. Но тут другая конструкция вылазите.
Ссылки не могут быть уникальным полем. Потому что одни и теже ссылки могут находится в базе. Просто присвоены разным формам.

Спойлер


QgKz56B.png

 

Ссылка на комментарий
Поделиться на других сайтах

Для меня идеальный вариант было бы выполнение INSERT + проверка перед записью, если есть такое поле пропустить.
Что бы это происходило на уровне базы данных.

Ссылка на комментарий
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.