Jump to content
Rassol2

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

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

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

  • +1 1

Share this post


Link to post
Share on other sites
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

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

Share this post


Link to post
Share on other sites
4 минуты назад, Rassol2 сказал:

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

 

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

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

так добавьте

  • +1 1

Share this post


Link to post
Share on other sites

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

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

  • +1 1

Share this post


Link to post
Share on other sites

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

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

 

  • +1 1

Share this post


Link to post
Share on other sites
9 минут назад, fanatic сказал:

 

так добавьте

 

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

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


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

 

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites
6 минут назад, Rassol2 сказал:

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

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

INSERT INTO table (id, name, value)
VALUES

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

(2,'name1','value2')

 

Share this post


Link to post
Share on other sites
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 необходимых запросов.
А ели у меня будет массив с запросами почему бы не обьеденить в один мульти запрос. И сократить количество соединений с базой.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 минуту назад, chukcha сказал:

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

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

Share this post


Link to post
Share on other sites
12 часов назад, Rassol2 сказал:

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

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

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

добавляем

не?

 

Share this post


Link to post
Share on other sites

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

  • +1 1

Share this post


Link to post
Share on other sites
2 часа назад, fanatic сказал:

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

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

добавляем

не?

 

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

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

Share this post


Link to post
Share on other sites
2 часа назад, chukcha сказал:

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

о да!

Share this post


Link to post
Share on other sites
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 не уникальный ключ.

Share this post


Link to post
Share on other sites
3 часа назад, chukcha сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
8 минут назад, fanatic сказал:

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

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

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

Share this post


Link to post
Share on other sites
12 минут назад, fanatic сказал:

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

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

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

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

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

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

 

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

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

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

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites
7 минут назад, Yesvik сказал:

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

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

Спойлер


QgKz56B.png

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Так добавь поле с хешем MD5 link+dn_id

  • +1 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.