В сегодняшней статье рассмотрим возможность вывода какой-либо информации из базы данных (посты, логи, комментарии, регистрации и т.д.) по дням (или по месяцам). То бишь записи будут выводиться некими блоками, каждый отдельный блок - какой-то конкретный промежуток времени (день, месяц, год).
В этот раз нам понадобится всего один файл, в котором мы будет писать код. Но и без библиотек тоже не обойдёмся, посему, как и всегда, начинаем в подключения библиотеки для работы с базой данных:
<?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>
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter