Перебор всех дней в году на 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.