Перебор всех дней в году на PHP


Закончил заказ, по сути ничего необычного, но вот именно то, что в заголовке – перебор дней – и заставило написать эту заметку.

Итак, необходимо было настроить прием данных онлайн с одного сервиса звонков (статистку) – установить вебхук, который принимает информацию, записывает в базу данных и отправляет на почту. Тут рассказывать нечего, задача стандартная: принимаем данные из $_POST, проверяем их, кодируем и отправляем в базу и на почту. Напоминаю, кстати, что необходимо провертять ip, откуда приходят данные.



Вторая задача тоже не самая уникальная – забрать данные за прошлые года по апи сервиса. Отправляем курлом гет запросы, ответ разбираем json и снова заносим в базу данных. Некоторую сложность добавляет то, что поля в вебхуках и апи могут не совпадать по названию и ответ в них тоже (например true - successful, false - unsuccessful), но это все решается чтением документации.

Дальше сложность идет в том, что объём большой и за один раз можно запросить информацию по тысяче звонков, а нам надо гораздо больше. Тут тоже все как обычно: делаем счетчик в базе данных и по крону вызываем (каждую минуту, например) наш скрипт скачивания данных. И вот тут я немного подзавис.

А как перебирать все звонки? Запрашиваем мы по дате, так что логично брать данные по одному дню – проходить по всем в году. Однако, тут сложность – формат даты такой “ДД/ММ/ГГГГ”. То есть нам надо узнавать число дней в году:

$days = 365 + date("L");
затем счетчик переводить в этот формат, а после прохождения года все повторять по новой. Вот перевод в формат и заставил немного подумать. Но затем пришла в голову другая мысль.

А что если сделать проще. Мы знаем, что число дней не может быть больше 31, месяцев – 12 и год окончания тоже знаем. Поэтому логично счетчик сделать не одинарный, а из трех чисел – и тогда проблема конвертирования формата даты пропадает. Получается в базе вот такая штука:



И очень простой код:

$result_dat = $conn->query("SELECT * FROM `import_call` WHERE `id` = '1'");
$row_dat = $result_dat->fetch_assoc();

$day = $row_dat['day'];
$month = $row_dat['month'];
$year = $row_dat['year'];
$dateFrom = $day."/".$month."/".$year;
/*
Тут отправляем запрос, получаем данные и заносим их в базу
*/

$day++;
if ($day > 31) {
$day = 1;
$month++;
if ($month > 12) {
$month = 1;
$year++;	
}	
}

$query2 = "UPDATE `import_call` SET `day` = '$day', `month` = '$month', `year` = '$year' WHERE `id` = '1'";	
mysqli_query($conn, $query2) or die (mysqli_error($conn));
Если в каком то месяце мы сделаем запрос на несуществующее количество дней – то просто обработать ошибку запроса. Вот и все - так просто можно обойти все дни в году. Если вам требуется решить такую или подобную задачу по забору данных или интеграции с различными сервисами – пишите мне – за разумные деньги решим ваш вопрос.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, решение задач, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Делаю программы на заказ
Русификация и регистрация на форуме MyBB
Работа с API