Правильно получить данные из stored proc

Автор Ulibka, 18 июня 2020, 19:00:42

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

Ulibka

18 июня 2020, 19:00:42 Последнее редактирование: 21 июня 2020, 05:00:29 от digger®
Несколько раз вылезает такая ошибка:

Ошибка базы данных
Commands out of sync; you can't run this command now
Файл: /home/w/woodtools/woodcraftsman.ru/public_html/Sources/LoadAds.php
Строка: 325

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

function updateAddHits($id)
{
global $smcFunc;
$smcFunc['db_query']('',"UPDATE {db_prefix}ads SET hits = hits+1 WHERE ADS_ID = $id");

}


С другой стороны не понимаю почему она запускается - я на рекламное объявление не нажимал.

Думал memcached - перезагрузил , ошибка осталась.

Подскажите пожалуйста идею - как поправить ?

Ulibka

Место возникновения ошибки локализовал.
Получаю данные от stored proc.

  $request = $smcFunc['db_query']('',
      'call get_last_topics_post({int:likely_max_msg})',
        array(
            'likely_max_msg' =>  $latestPostOptions['number_posts'],
        )
    );

Дальше написал отладочный текст:

$smcFunc['db_free_result']($request);

    $request = $smcFunc['db_query']('',
        'select * from {db_prefix}member limit 1',
        array( 'likely_max_msg' =>  $latestPostOptions['number_posts'] )
    );
    $smcFunc['db_free_result']($request);

На втором запросе валится с ошибкой
Commands out of sync; you can't run this command now


собственно на втором вызове идет вызов mysqli_query c последним параметром MYSQLI_USE_RESULT :
https://www.php.net/manual/ru/mysqli.query.php

При этом все последующие вызовы этой функции будут возвращать ошибку:
 Commands out of sync
до тех пор, пока не будет вызвана функция mysqli_free_result()

Но я же прям сразу вызываю $smcFunc['db_free_result']($request);
после первого вызова $smcFunc['db_query']

Никак не пойму - в чем может быть проблема?

Внутри прекрасно работает получение данных от stored proc.

Подскажите пожалуйста - как правильно вызывать stored proc в SMF ?

digger®

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

Ulibka

По моему глубокому убеждению любое приложение должно использовать хранимые процедуры по мере возможности(это мое личное мнение разработки приложений на desktop)

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

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


Ulibka

Внедрил сегодня вызов stored proc.
Важно ! stored proc из этого примера возвращает ровно один result set,
Если у Вас несколько result set, то их наверно надо очистить все.

Вызов:
$request = $smcFunc['db_query']('','call get_last_topics_post ( {int:likely_max_msg})' ...

.. что то делается с полученными данными

Очистка:
  $smcFunc['db_free_result']($request);

Новые две строки , которые надо добавить после db_free_result
  global $db_connection;
  mysqli_next_result($db_connection);

Т.е. кроме вызова стандартной очистки надо затребовать второй (пустой) набор данных.

Работает только и исключительно на MySQL

P.S. Как пример.
Запустил выборку, у меня на конце стоит order asc
Пользователи пишут хотим order desc

В случае со stored proc внесение изменений намного прозрачнее,
более того можно протестировать новую выборку "не отходя от кассы".

P.P.S надо было мне удалить 50 тыс. пользователей (накопилось за много лет)
На PHP это сделать крайне тяжело!

Написал stored proc и процесс прошел как по маслу !
(правда минут за 20)

digger®

Цитата: Ulibka от 20 июня 2020, 15:52:20Вызов:
$request = $smcFunc['db_query']('','call get_last_topics_post ( {int:likely_max_msg})' ...
В чем выигрыш по сравнению с
$request = $smcFunc['db_query']('','SELECT что-то из чего-то') ?


Цитата: Ulibka от 20 июня 2020, 15:52:20P.P.S надо было мне удалить 50 тыс. пользователей (накопилось за много лет)
На PHP это сделать крайне тяжело!

Написал stored proc и процесс прошел как по маслу !
(правда минут за 20)
Почему нельзя их просто sql запросом удалить?
20 минут это жесть как долго, почему так?

Ulibka

Цитата: digger® от 20 июня 2020, 16:11:27В чем выигрыш по сравнению с
$request = $smcFunc['db_query']('','SELECT что-то из чего-то') ?

Почему нельзя их просто sql запросом удалить?
20 минут это жесть как долго, почему так?

Если только один запрос - то да.
В этой stored создается временная таблица и дальше идет select
Я думаю что так будет быстрее.
В целом логика может быть конечно более сложной

Ulibka

Цитата: digger® от 20 июня 2020, 16:11:27Почему нельзя их просто sql запросом удалить?
20 минут это жесть как долго, почему так?


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