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


Адаптация вычисления для Cron


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

#1 ber

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

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

Отправлено 16 Январь 2016 - 11:35

Подскажите пожалуйста, надо, что бы вот это вычисление:

if($line['Вызывающий номер']!="" and $line['Вызывающий номер']=="79990001122"){
$phone=substr($line['Вызывающий номер'],1);
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."87 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f1193`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%') OR (replace(replace(replace(replace(replace(`f1125`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1";
$result = sql_query($sqlQuery);
if (sql_num_rows($result) > 0) {
$select = sql_fetch_assoc($result);
$line['DAF'] = $select['id'];
};
};

Работало в Cron.

Так выглядит моя тщетная попытка адаптации:

$result = data_select(320, "status=0"); // цикл по всем активным записям таблицы 111
while ($line = sql_fetch_assoc($result)) // помещаем в $line текущую запись на очередном проходе цикла
{
  if($line['f6630']!="" and $line['f6630']=="79990001122"){
$phone=substr($line['f6630'],1);
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."87 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f1193`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%') OR (replace(replace(replace(replace(replace(`f1125`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1";
$result = sql_query($sqlQuery);
if (sql_num_rows($result) > 0) {
$select = sql_fetch_assoc($result);
$line['f6680'] = $select['id'];
};
};
}

Сообщение отредактировал ber: 03 Март 2016 - 15:49

www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#2 CbCoder

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

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

Отправлено 18 Январь 2016 - 11:31

Все верно, за исключением одной "мелочи". В табличном вычислении помещение значения в переменную $line означает автоматическое сохранение в БД (в текущей записи) после выполнения вычисления. В кроне же этого по понятным причинам нет. Поэтому сохранять значение в БД нужно самостоятельно, через запрос.

#3 ber

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

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

Отправлено 18 Январь 2016 - 12:10

Просмотр сообщенияCbCoder (18 Январь 2016 - 11:31) писал:

Все верно, за исключением одной "мелочи". В табличном вычислении помещение значения в переменную $line означает автоматическое сохранение в БД (в текущей записи) после выполнения вычисления. В кроне же этого по понятным причинам нет. Поэтому сохранять значение в БД нужно самостоятельно, через запрос.

Могли бы помочь с недостающей частью кода по сохранению значения?
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#4 CbCoder

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

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

Отправлено 18 Январь 2016 - 12:14

Стандартный запрос на обновление данных, например через функцию data_update. См. документацию.

#5 ber

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

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

Отправлено 18 Январь 2016 - 14:36

Просмотр сообщенияCbCoder (18 Январь 2016 - 12:14) писал:

Стандартный запрос на обновление данных, например через функцию data_update. См. документацию.

Всю голову сломал, что не так?

$dat=date("Y-m-d 00:00:00", time() - 60*60*24*1);
$result = data_select(320, "'status'='0' AND 'f6620'>'",$dat,"'");
while ($line = sql_fetch_assoc($result))
{
$phone=substr($line['6630'],1);
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."87 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f1193`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%') OR (replace(replace(replace(replace(replace(`f1125`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1";
$result = sql_query($sqlQuery);
if (sql_num_rows($result) > 0) {
$select = sql_fetch_assoc($result);
$line['f6680'] = $select['id'];
$data_update(320, "'id'='",$line['ID'],"'");
};
}

www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#6 ber

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

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

Отправлено 18 Январь 2016 - 14:49

Я так понимаю проблема в этих двух строчках:

$line['f6680'] = $select['id'];
$data_update(320, array('f6680'=>'$select['id']'), "'id'='",$line['ID'],"'");

Как правильно изложить задумку?
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#7 CbCoder

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

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

Отправлено 18 Январь 2016 - 16:12

У вас полная каша с синтаксисом.

data_update(320, array('f6680'=>$select['id']), "id=",$line['id']);

Строка $line['f6680'] = $select['id']; уже не нужна.

#8 ber

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

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

Отправлено 18 Январь 2016 - 16:56

Не выходит, итоговый код:

$dat=date("Y-m-d 00:00:00", time() - 60*60*24*90);
$result = data_select(320, "'status'='0' AND 'f6620'>'",$dat,"'"); // 320 - номер таблицы, 6620 - номер поля "Начало звонка"
while ($line = sql_fetch_assoc($result))
{
$phone=substr($line['f6630'],1); // 6630 - номер поля "Входящий номер"
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."87 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f1193`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%') OR (replace(replace(replace(replace(replace(`f1125`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1"; // 87 - номер таблицы, 1193 и 1125 - поля, содержащие номера телефонов
$result = sql_query($sqlQuery);
if (sql_num_rows($result) > 0) {
$select = sql_fetch_assoc($result);
data_update(320, array('f6680'=>$select['id']), "id=",$line['id']); // 320 - номер таблицы, 6680 - Поле типа "Связь" куда надо записать ID найденной записи в которой поле 1193 или 1125 равно 6630
};
}

Может еще что-то пропустил?
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#9 CbCoder

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

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

Отправлено 18 Январь 2016 - 17:03

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

#10 CbCoder

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

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

Отправлено 18 Январь 2016 - 17:06

Нашел: снова та же байда с синтаксисом в запросах, только уже в базовом запросе на выборку:

$result = data_select(320, "'status'='0' AND 'f6620'>'",$dat,"'"); // 320 - номер таблицы, 6620 - номер поля "Начало звонка"

Зачем вы имена полей норовите в кавычки упрятать? В кавычках могут быть только строковые константы, но никак не имена сущностей.

#11 ber

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

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

Отправлено 18 Январь 2016 - 17:51

Работает, только есть тут:

$dat=date("Y-m-d 00:00:00", time() - 60*60*24*90);

...поставить не более чем 60*60*24*4
Если ставлю 5 и более дней, то ничего не происходит... Как так?
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#12 CbCoder

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

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

Отправлено 19 Январь 2016 - 09:04

Нет записей, удовлетворяющих условию? У меня нет других версий.

#13 ber

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

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

Отправлено 19 Январь 2016 - 09:58

Просмотр сообщенияCbCoder (19 Январь 2016 - 09:04) писал:

Нет записей, удовлетворяющих условию? У меня нет других версий.

Нет, я делаю специально подходящую запись, ставлю 10 (к примеру) дней и с этой записью ничего не происходит. Меняю в коде на 4 дня и все нормально срабатывает. При этом в записи я ничего не менял.
www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#14 CbCoder

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

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

Отправлено 19 Январь 2016 - 11:15

Тогда не знаю. Необходима отладка кода с проверкой запроса.

#15 ber

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

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

Отправлено 19 Январь 2016 - 11:24

Ок, и еще вопрос, если вообще снять ограничение по датам, то получается вот:

Результат:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 144 bytes) in/var/www/cb/include/sql_functions.php on line 186


В таблице около 60 000 записей. В чем причина?

Сообщение отредактировал ber: 19 Январь 2016 - 11:25

www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#16 CbCoder

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

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

Отправлено 19 Январь 2016 - 11:38

Оперативная память забивается.

#17 CbCoder

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

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

Отправлено 19 Январь 2016 - 11:42

Нашел потенциальное место проблем: у вас 2 разных запроса (базовый по циклу и внутри него) используют одну и ту же переменную $result, что в итоге может привести к накладкам. Используйте разные переменные.

#18 ber

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

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

Отправлено 19 Январь 2016 - 17:13

И еще вопрос :)

В коде несколько проверок:

$dat=date("Y-m-d 00:00:00", time() - 60*60*24*20);
$result = data_select(320, "status='0' AND f6620>'",$dat,"' AND id='74676'"); // 320 - номер таблицы, 6620 - номер поля "Начало звонка"
while ($line = sql_fetch_assoc($result))
{
$phone=substr($line['f6630'],1); // 6630 - номер поля "Входящий номер"
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."87 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f1193`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%') OR (replace(replace(replace(replace(replace(`f1125`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1"; // 87 - номер таблицы, 1193 и 1125 - поля, содержащие номера телефонов
$result2 = sql_query($sqlQuery);
if (sql_num_rows($result2) > 0) {
$select = sql_fetch_assoc($result2);
data_update(320, EVENTS_ENABLE, array('f6680'=>$select['id']), "id=",$line['id']); // 320 - номер таблицы, 6680 - Поле типа "Связь" куда надо записать ID найденной записи в которой поле 1193 или 1125 равно 6630
};
$phone=substr($line['f6630'],1); // 6630 - номер поля "Входящий номер"
$sqlQuery = "SELECT `id` FROM ".DATA_TABLE."51 WHERE (`status`='активен' and (replace(replace(replace(replace(replace(`f548`,' ',''),'+',''),'-',''),'(',''),')','') LIKE '%".$phone."%')) LIMIT 1";
$result10 = sql_query($sqlQuery);
if (sql_num_rows($result10) > 0) {
$select8 = sql_fetch_assoc($result10);
data_update(320, EVENTS_ENABLE, array('f12160'=>$select8['id']), "id=",$line['id']);
};
}

После каждого указано EVENTS_ENABLE, но по факту проверка вычислений происходит только один раз в первый сработавший data_update

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

Сообщение отредактировал ber: 19 Январь 2016 - 17:33

www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто

#19 CbCoder

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

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

Отправлено 19 Январь 2016 - 17:53

Это не "проверка на вычисления", а запуск событий на изменение полей, в случае если изменение поля реально имеет место. Т.е., если у вас "по факту" вычисление срабатывает только при первом запросе, а на втором - нет, значит реальное изменение поля произошло только в первом случае. Других причин не нахожу.

#20 ber

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

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

Отправлено 20 Январь 2016 - 09:40

Просмотр сообщенияCbCoder (19 Январь 2016 - 17:53) писал:

Это не "проверка на вычисления", а запуск событий на изменение полей, в случае если изменение поля реально имеет место. Т.е., если у вас "по факту" вычисление срабатывает только при первом запросе, а на втором - нет, значит реальное изменение поля произошло только в первом случае. Других причин не нахожу.

Реальное изменение поля произошло в обоих случаях. И на изменение обоих полей есть вычисление (одно).
При этом если я меняю местами два блока текста кода, то срабатывает второе, поскольку оно становится выше.

Сейчас покажу на примере логов...

Сообщение отредактировал ber: 20 Январь 2016 - 09:46

www.its-truck.ru - Группа компаний ИТС
www.intertransservice.ru - ИТС-МАН - Официальный дилер MAN Truck and Bus
www.its-daf.ru - ИТС-ДАФ - Официальный дилер DAF Trucks
www.its-hino.ru - ИТС-Хино - Официальный дилер Hino Motors
www.its-kamaz.ru - ИТС-Камаз - Официальный дилер ПАО КамАЗ
www.trp-parts.ru - Интернет-магазин запасных частей для грузовых авто





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

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