Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

Здравствуйте.
А в опенкарт вообще можно создать мульти запрос.
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
Надіслати
Поділитися на інших сайтах

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

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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.