KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Вывод записей из БД по дням (по месяцам)

Статьи / PHP

В сегодняшней статье рассмотрим возможность вывода какой-либо информации из базы данных (посты, логи, комментарии, регистрации и т.д.) по дням (или по месяцам). То бишь записи будут выводиться некими блоками, каждый отдельный блок - какой-то конкретный промежуток времени (день, месяц, год).



В этот раз нам понадобится всего один файл, в котором мы будет писать код. Но и без библиотек тоже не обойдёмся, посему, как и всегда, начинаем в подключения библиотеки для работы с базой данных:

<?php

    require_once 'vendor/autoload.php';


    const SERVER = 'localhost';
    const USERNAME = 'Имя пользователя';
    const PASSWORD = 'Пароль';
    const DATABASE_NAME = 'Имя базы данных';
    const CHARSET = 'utf8mb4';

    $db = \Krugozor\Database\Mysql::create( SERVER, USERNAME, PASSWORD )->setDatabaseName( DATABASE_NAME )->setCharset( CHARSET ); // Подключение к БД

?>


Ниже создаю простую HTML-структуру с блоком posts, в котором я выведу все посты из БД по дням:

<!DOCTYPE html>
<html lang="ru">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Главная</title>

        <style>
            .posts{max-width:350px }
            .posts__title{width:100%;height:50px;line-height:50px;border-radius:8px;background-color:#dfe3f0;text-align:center;font-size:18px;font-weight:700 }
            .posts__body{position:relative;overflow:hidden;word-wrap:break-word }
            .posts__body:before{content:'';position:absolute;top:-10px;width:3px;height:calc(100% + 10px);margin-left:15px;background-color:#dfe3f0 }
            .posts__day{position:relative;height:40px;line-height:40px;margin:10px 0;padding:0 15px;border-radius:5px 20px 20px 5px;background-color:#dfe3f0;font-size:15px;font-weight:700;z-index:2 }
            .posts__item{position:relative;margin:0 0 20px 30px;font-size:14px }
            .posts__item:before{content:'';position:absolute;top:2px;left:-21.5px;width:16px;height:16px;border-radius:8px;background-color:#dfe3f0 }
        </style>

    </head>

    <body>

        <div class="posts">
            <div class="posts__header">
                <div class="posts__title">Список постов</div>
            </div>
            <div class="posts__body">

                <?php

                    // Тут будет php-код

                ?>

            </div>
        </div>

    </body>

</html>


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

Итак, делаю запрос к БД (для статьи я добавил таблицу posts с тремя полями, она нам и понадобится сейчас), а далее создаю цикл while:

<?php

    $result = $db->query( "SELECT * FROM `posts` ORDER BY `time` DESC LIMIT 15" );

    while ( $row = $result->fetchAssoc() )
    {

        // Тут продолжим писать код

    }

?>


В переменную $current_day записываю дату текущего поста в формате дд.мм.гггг:

$current_day = date( 'd.m.Y', $row['time'] );

Если записи нужно выводить не по дням, а по месяцам - значит убираем дни из шаблона (мм.гггг):

$current_day = date( 'm.Y', $row['time'] );


Затем просто сравниваем текущую дату с предыдущей. Если они не совпадают - выводим текущую дату:

if ( $current_day != $prev_day )
{
    $prev_day = $current_day;

    print '<div class="posts__day">' . $current_day . '</div>';
}


После такой проверки можно смело печатать саму запись (в моём случае - текст поста):

print '<div class="posts__item">' . $row['text'] . '<br><span class="history__date">' . date( 'd.m.y H:i:s', $row['time'] ) . '</span></div>';


И на этом этапе уже можно идти проверять работу скрипта:


Весь код:

<?php

    require_once 'vendor/autoload.php';


    const SERVER = 'localhost';
    const USERNAME = 'Имя пользователя';
    const PASSWORD = 'Пароль';
    const DATABASE_NAME = 'Имя базы данных';
    const CHARSET = 'utf8mb4';

    $db = \Krugozor\Database\Mysql::create( SERVER, USERNAME, PASSWORD )->setDatabaseName( DATABASE_NAME )->setCharset( CHARSET ); // Подключение к БД

?>





<!DOCTYPE html>
<html lang="ru">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Главная</title>

        <style>
            .posts{max-width:350px }
            .posts__title{width:100%;height:50px;line-height:50px;border-radius:8px;background-color:#dfe3f0;text-align:center;font-size:18px;font-weight:700 }
            .posts__body{position:relative;overflow:hidden;word-wrap:break-word }
            .posts__body:before{content:'';position:absolute;top:-10px;width:3px;height:calc(100% + 10px);margin-left:15px;background-color:#dfe3f0 }
            .posts__day{position:relative;height:40px;line-height:40px;margin:10px 0;padding:0 15px;border-radius:5px 20px 20px 5px;background-color:#dfe3f0;font-size:15px;font-weight:700;z-index:2 }
            .posts__item{position:relative;margin:0 0 20px 30px;font-size:14px }
            .posts__item:before{content:'';position:absolute;top:2px;left:-21.5px;width:16px;height:16px;border-radius:8px;background-color:#dfe3f0 }
        </style>

    </head>

    <body>

        <div class="posts">
            <div class="posts__header">
                <div class="posts__title">Список постов</div>
            </div>
            <div class="posts__body">

                <?php

                    $result = $db->query( "SELECT * FROM `posts` ORDER BY `time` DESC LIMIT 15" );

                    while ( $row = $result->fetchAssoc() )
                    {

                        $current_day = date( 'd.m.Y', $row['time'] );

                        if ( $current_day != $prev_day )
                        {
                            $prev_day = $current_day;

                            print '<div class="posts__day">' . $current_day . '</div>';
                        }

                        print '<div class="posts__item">' . $row['text'] . '<br><span class="history__date">' . date( 'd.m.y H:i:s', $row['time'] ) . '</span></div>';

                    }

                ?>

            </div>
        </div>

    </body>

</html>


posts.zip

  • 5id15
  • 15.07.2022
  • 2 446
  • 1
Создаём рулетку с разной вероятностью выпадения призов на PHP
Создаём рулетку с разной вероятностью выпадения призов на PHP
3-07-2022, 15:17, PHP
Форматы вывода дат относительно текущего времени
Форматы вывода дат относительно текущего времени
14-07-2022, 00:16, PHP
  1. Негодую

    Негодую Гость 6 августа 2022 13:28

    А можно просто сгрупировать нужные данные по дням в sql запросе и не городить кучу ненужно кода.

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4125
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2023. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль