Форум русской поддержки Joomla!® CMS
07.12.2016, 12:48:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

INSERT в запросе UPDATE используя конструктор Joomla

 (Прочитано 137 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« : 14.11.2016, 14:50:32 »

Доброго времени суток уважаемые форумчане. Хотел спросить, возможно ли выполняя запрос на обновление записей в БД сделать под запрос со вставкой данных в другую таблицу ?
Имеется вот такой код, он работает в цикле. Проходит по очереди все записи и списывает с учеток средства (автоматическое списание средств абонентов согласно тарифу.)

Код
        for($i = 0; $i < count($list); $i++) { 
           $db = JFactory::getDbo();
           $query = $db->getQuery(true);
           $fields = array(
               $db->quoteName('balance_tv'). ' = ' . $db->quoteName('balance_tv').'-'.$db->quote($list[$i][2]),
           );
           $conditions = array(
               $db->quoteName('tarif_tv'). '='. $db->quote($list[$i][0]),
               $db->quoteName('status_tv'). '= 1 '
           );
           $query->update($db->quoteName('#__clients'))->set($fields)->where($conditions);
           $db->setQuery($query);
           $result = $db->execute();
       }
 

И в этом запросе мне нужно сделать INSERT в другую таблицу (таблица с историей изменения баланса). Если такое возможно - напишите плз где что почитать или ткните как сделать. Скрипт обрабатывает относительно много записей и что то городить лапшичное боюсь . По сути мне нужно вставить в таблицу #__log данные с ид пользователя у которого списали средства и сумму списания
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #1 : 14.11.2016, 15:17:49 »

В одном запросе у вас не получится делать вставки и обновления. По уму вам нужно использовать транзакции, batch insert и update. Тогда запроса будет всего два. Вы в вашем коде прогоняете по одному запросу за каждую итерацию цикла. Странно что у вас сервер не лег еще, если как вы говорите записей у вас много.
« Последнее редактирование: 14.11.2016, 15:23:50 от zomby6888 » Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #2 : 14.11.2016, 15:36:30 »

В одном запросе у вас не получится делать вставки и обновления. По уму вам нужно использовать транзакции, batch insert и update. Тогда запроса будет всего два. Вы в вашем коде прогоняете по одному запросу за каждую итерацию цикла. Странно что у вас сервер не лег еще, если как вы говорите записей у вас много.

За batch - спс, сейчас Google что это и с чем едят (ранее не сталкивался, не было потребности).
Записан
SmokerMan
Профи
********

Репутация: +694/-25
Offline Offline

Пол: Мужской
Сообщений: 5225



« Ответ #3 : 14.11.2016, 15:46:03 »

Цитировать
INSERT в запросе UPDATE
называется REPLACE Azn
но при этом надо следить что бы те данные которые записываются были идентичны тем что уже есть, иначе сотрутся не заполненные поля
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #4 : 14.11.2016, 15:48:17 »

называется REPLACE Azn
но при этом надо следить что бы те данные которые записываются были идентичны тем что уже есть, иначе сотрутся не заполненные поля

суть в том что я делаю UPDATE в одной таблице а INSERT нужен к совсем другой. Тут REPLACE не подойдет явно ))
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #5 : 15.11.2016, 04:26:14 »

Господа, хотел бы у вас спросить : на счет bath, как советовал zomby6888, начал гуглить и читать  вещь интересная, но в связи с этим появилась пара вопросов.

У меня скрипт, в котором цикл циклом погоняет, создан для того что бы выполнять его по расписанию и является отдельным файлом не в компоненте Joomla. В самом скрипте я подключил либы Joomla для доступа к ее инструментам. Однако мне потребовалось вывести логи Joomla (стандартный инструмент отладки Joomla) в этом файле что бы посмотреть что там вообще происходит по времени и памяти в момент выполнения моего мега *** кода.

Подскажите как вывести консоль отладки Joomla в стороннем файле ?

И второй вопрос : у меня будет после работы скрипта происходить запись в отдельную таблицу (грубо говоря логирования). Логировать через фаил я не решился т.к записей предположительно будет много (исходя из предположительного количества абонентов 5 к то за год будет минимум 60 к записей  - 12 записей по 1 в месяц для каждого абонента ). В связи с этим [ВНЕЗАПНО!:)] я стал задумываться о том что же это будет : дохерища записей в таблице с логами.
По этому хотел у вас спросить : что можно предпринять что бы упростить работу для сайта в плане работы с логами ? Не ляжет ли сам сайт через год - 2 из-за большого количества записей в таблице с логами ? (предполагается отдельный компонент для просмотра логов, что бы было удобнее)

В общем как то так. Подскажите, направьте на путь истинный )
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Online Online

Сообщений: 7768



« Ответ #6 : 15.11.2016, 11:09:52 »

60К записей в год это много? то вы еще журнала nginx не видели Azn 60К в год это пыль... log rotate поставите в крайнем случае
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #7 : 15.11.2016, 11:13:18 »

Подскажите как вывести консоль отладки Joomla в стороннем файле ?
Посмотрите PlgSystemDebug().
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #8 : 15.11.2016, 13:09:42 »

60К записей в год это много? то вы еще журнала nginx не видели Azn 60К в год это пыль... log rotate поставите в крайнем случае

ну тогда я спокоен ))
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #9 : 15.11.2016, 13:09:56 »

Посмотрите PlgSystemDebug().

Гляну, спасибо )
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #10 : 16.11.2016, 06:01:31 »

В одном запросе у вас не получится делать вставки и обновления. По уму вам нужно использовать транзакции, batch insert и update. Тогда запроса будет всего два. Вы в вашем коде прогоняете по одному запросу за каждую итерацию цикла. Странно что у вас сервер не лег еще, если как вы говорите записей у вас много.

Уважаемый zomby6888 , прошу немного объяснить по поводу batch . На сколько я понимаю транзакции позволяют делать несколько однотипных запросов в БД при этом снимая нагрузку с сервера. Я нашел метод

$db->transactionStart();  и  $db->queryBatch(); в стандартных инструментах работы Joomla с БД однако у меня возникло пара вопросов.

Получается что я должен в цикле создать серию запросов типа UPDATE `#__clients` SET `balance_domophone` = `balance_domophone`-'25' ;  и после передать всю строку с запросами в batch . Однако как мне это сделать  : в цикле присвоить переменной запросы и потом вне цикла ее отдать на исполнение или в цикле  и делать запрос ?

пример :

Код
try
{
   $db->transactionStart();
       // обновление баланса Домофон
      for($i = 0; $i < count($list2); $i++) {
           $fields = array(
               $db->quoteName('balance_domophone'). ' = ' . $db->quoteName('balance_domophone').'-'.$db->quote($list2[$i][2]),
           );
 
           $conditions = array(
               $db->quoteName('tarif_domophone'). '='. $db->quote($list2[$i][0]),
               $db->quoteName('status_domophon'). '= 1 '
           );
           $sql .=  $query->update($db->quoteName('#__clients'))->set($fields)->where($conditions).";";
       }
 
 
   $db->setQuery($sql);
   $db->queryBatch();
 
   $result = $db->execute();
   $db->transactionCommit();
}
catch (Exception $e)
{
   // catch any database errors.
   $db->transactionRollback();
   JErrorPage::render($e);
}
 

Так же не совсем ясна ситуация с методом $db->queryBatch(); - я так понял что его нет в Joomla 3 , тогда как быть  ?

Я прошу прощение за глупые вопросы но инфы в сети по данной теме практически нет и я не смогу найти ничего вразумительного
Записан
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« Ответ #11 : 16.11.2016, 08:00:50 »

Доходит до меня видимо как до жирафа. Сосбвтенно почему не ложится сервер, как писали в топике, при выполнении запросов в БД в цикле . Суть такова что мне нужно выбрать н-ное количество тарифов из бд, и после в цикле списать с пользователей сумму с их баланса согласно тарифу. Тарифов не много и получается что я имею массив с тарифами, допустим 3 тарифа, и в цике делаю запрос на обновление баланса пользователей  с выборкой по тарифному плану. То есть в записе

Код
        for($i = 0; $i < count($list); $i++) { 
           $db = JFactory::getDbo();
           $query = $db->getQuery(true);
           $fields = array(
               $db->quoteName('balance_tv'). ' = ' . $db->quoteName('balance_tv').'-'.$db->quote($list[$i][2]),
           );
           $conditions = array(
               $db->quoteName('tarif_tv'). '='. $db->quote($list[$i][0]),
               $db->quoteName('status_tv'). '= 1 '
           );
           $query->update($db->quoteName('#__clients'))->set($fields)->where($conditions);
           $db->setQuery($query);
           $result = $db->execute();
       }
 

получается на выходе всего лишь 3 запроса т.к будет лишь 3 тарифа и следовательно 3 итерации цикла.   Стыжусь каюсь, реально доходило долго .

Однако вопрос : мне нужно записать в таблицу с логами запись в которой будет указан id пользователя и сумма списания. При этом нужно знать сумму списания которая находится в пределах цикла for:

Код
for($i = 0; $i < count($list); $i++) { 
 

И вот как это сделать я не могу понять . Вот здесь видимо и пригодились бы транзакции информации о которых не так уж много (
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet