Перейти к содержимому


Перенос вычисления в cron


Сообщений в теме: 22

#1 TelecomMedia

    Активный участник

  • Пользователи
  • PipPipPip
  • 378 сообщений

Отправлено 25 Февраль 2015 - 08:27

В т. "Обработка заявок" есть вычисление, которое при совпадении полей в т. "Заявки WEB" копирует туда название клиента. Код:
data_update(1071, array("f27151" => $line['ID']), "f26901='",$line['E-mail'],"' or f26891='",$line['Телефон'],"' or f26911='",$line['Домен сайта'],"'");

Как можно перенести данное вычисление в cron?

В техподдержке мне ответили: такого рода вычисление не будет работать в кроне, т.к. в нем не содержится данных в переменной $line.

Как переписать мое вычисление в соответствии с рекомендацией?

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Февраль 2015 - 11:07

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

$result = data_select(111, "status=0"); // цикл по всем активным записям таблицы 111
while ($line = sql_fetch_assoc($result)) // помещаем в $line текущую запись на очередном проходе цикла
{
   // ваш код из вычисления. В самом коде нужно заменить русские имена полей в $line на внутренние
}


ВНИМАНИЕ! С учетом нижеописанной Radik'ом ситуации (т.е. когда данные в $line обновляются), обновленный вариант такой:

$result = data_select(111, "status=0"); // цикл по всем активным записям таблицы 111
while ($line = sql_fetch_assoc($result)) // помещаем в $line текущую запись на очередном проходе цикла
{
   // ваш код из вычисления. В самом коде нужно заменить русские имена полей в $line на внутренние

   data_update(111, $line, "id=",$line['id']); // обновляем текущую строку запросом, если поля в $line менялись!
}

Сообщение отредактировал CbCoder: 29 Март 2016 - 17:45


#3 Radik

    Активный участник

  • Пользователи
  • PipPipPip
  • 117 сообщений

Отправлено 06 Апрель 2015 - 17:03

$result1 = data_select(62, "status=0"); // цикл по всем активным записям таблицы 62
while ($line = sql_fetch_assoc($result1)) // помещаем в $line текущую запись на очередном проходе цикла
{
  // ваш код из вычисления. В самом коде нужно заменить русские имена полей в $line на внутренние

  $result2 = data_select_field(371, "`f12820`", "`id`=",$line['f11771']);
  if ($row = sql_fetch_assoc($result2)) $line['f19720'] = $row['f12820'];
}
Помогите пожалуйста, почему такой код не отрабатывает по всем записям?

#4 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 06 Апрель 2015 - 18:21

Если у вас в if в скобках дано условие, то надо == писать, а не =. Так вы просто присваиваете значение.
Попробуйте так:

$result1 = data_select(62, "status=0");
while ($line = sql_fetch_assoc($result1)) {
  $result2 = data_select_field(371, "`f12820`", "`id`=",$line['f11771']);
  if ($row == sql_fetch_assoc($result2)) {
    $line['f19720'] = $row['f12820'];
  }
}


#5 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 07 Апрель 2015 - 09:32

Цитата

Если у вас в if в скобках дано условие, то надо == писать, а не =. Так вы просто присваиваете значение.

Так ему и нужно присвоение, а не сравнение (условие проверяет результат присвоения), так что все правильно.

#6 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 10 Апрель 2015 - 16:33

То есть работает конструкция типа "пока есть что присвоить"?

while ($line = sql_fetch_assoc($result1)) {

Сообщение отредактировал Александр Пономарев: 10 Апрель 2015 - 16:34


#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 12 Апрель 2015 - 13:46

То что вы сейчас указали, это "делать пока результат присвоения не пустой", а то о чем я писал выше, это "делать если результат присвоения не пустой". Но суть похожа, да.

#8 sofronovnik

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 04 Февраль 2016 - 17:40

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

#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Февраль 2016 - 12:08

Ели у вас есть id строки, то разумеется можно обратится к строке через стандартный sql-запрос к БД.

#10 GoGPS

    Активный участник

  • Пользователи
  • PipPipPip
  • 159 сообщений
  • Пол:Мужчина

Отправлено 03 Март 2016 - 10:34

Просмотр сообщенияsofronovnik (04 Февраль 2016 - 17:40) писал:

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

Смогли разобраться?

#11 Radik

    Активный участник

  • Пользователи
  • PipPipPip
  • 117 сообщений

Отправлено 04 Март 2016 - 16:53

Просмотр сообщенияRadik (06 Апрель 2015 - 17:03) писал:

$result1 = data_select(62, "status=0"); // цикл по всем активным записям таблицы 62
while ($line = sql_fetch_assoc($result1)) // помещаем в $line текущую запись на очередном проходе цикла
{
  // ваш код из вычисления. В самом коде нужно заменить русские имена полей в $line на внутренние

  $result2 = data_select_field(371, "`f12820`", "`id`=",$line['f11771']);
  if ($row = sql_fetch_assoc($result2)) $line['f19720'] = $row['f12820'];
}
Помогите пожалуйста, почему такой код не отрабатывает по всем записям?

так и не получил ответа в чем причина невыполнения присвоения?

#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 04 Март 2016 - 17:09

Причина элементарна - у вас в коде нет запроса на обновление данных. Переменная $line в коде крона не является системной, и поэтому, в отличии от вычислений, автоматом данные обновлять не будет.

#13 Radik

    Активный участник

  • Пользователи
  • PipPipPip
  • 117 сообщений

Отправлено 18 Март 2016 - 16:37

Спасибо, можете пример рабочего похожего кода привести?

#14 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 18 Март 2016 - 17:26

data_update(62, $line, "id=",$line['id']);


#15 Darling

    Участник

  • Пользователи
  • PipPip
  • 14 сообщений

Отправлено 23 Март 2016 - 17:10

$result = data_select(42, "status=0"); // цикл по всем активным записям таблицы 42
while ($line = sql_fetch_assoc($result)) // помещаем в $line текущую запись на очередном проходе цикла
{

$total = 2;

data_update(42, array('f1100'=>$total), " `id`= '",$line['id'],"' "); // код поменяет значение поля $line['f1100'] в таблице 42, у всех записей которые имеют активный статус.
}

Сообщение отредактировал Darling: 23 Март 2016 - 17:47


#16 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Март 2016 - 17:36

Это вы к чему? Хотели сделать общий пример? В целом верно, только пример с $total = 1 + 1 слишком надуманный (почему бы просто не $total = 2 тогда уж), а также в выражении array('f1100'=>"$total") непонятно зачем переменная в кавычках, хотя проще и правильнее писать array('f1100'=>$total). Если хотели преобразовать число в текст таким образом, то никакой необходимости в этом здесь нет.

#17 Darling

    Участник

  • Пользователи
  • PipPip
  • 14 сообщений

Отправлено 23 Март 2016 - 17:48

Поправил, выложил для общего примера и понимания. Замечания не критичны =) будет работать и так.

Сообщение отредактировал Darling: 23 Март 2016 - 17:54


#18 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 23 Март 2016 - 18:15

Я тоже обновил инструкцию в начале темы: https://clientbase.r...indpost&p=27265. Там более общий пример.

#19 Darling

    Участник

  • Пользователи
  • PipPip
  • 14 сообщений

Отправлено 24 Март 2016 - 13:27

Только из примера не понятно какое поле обновляется через data_update (значение просто $line вводит в ступор), поэтому пример лучше показывать массивом строк с указанием конкретной строки.
Все таки пример для начинающих кодеров. А вообще не плохо было бы правильным образом оформлять шапку так, как это делают на известном компьютерном форуме.

Сообщение отредактировал Darling: 24 Март 2016 - 13:30


#20 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 24 Март 2016 - 13:32

$line - не переменная, а массив (строка таблицы). Обращение к элементам по ключам: $line['key'].
Конструкция data_update(62, $line,"id=",$line['id']); обновляет всю строку для строки, в которой ключ 'id' равен ключу 'id' текущей записи.
Так понятнее?





Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных