Целью данной функции является минимизация кода, и возможность использовать одну функцию как для поиска, так и для основного отображения статей на сайте.
В целом все началось с того, что мне потребовался paginator для главной страницы создаваемого мной блога. Но, я был крайне удивлен тому, что все готовые решения, либо заточены под какую-либо CMS, либо настолько громоздки, что количество кода превышает общее количество кода самого блога. Далеко не буду ходить, думаю многим известен Pagination.ru.
Конечно же проще чем использовать MySQL LIMIT, думаю искать ничего не стоит. Идея не нова, использовалась и описывалась сотни раз, поэтому на оригинальность я не претендую, всего лишь делюсь удобной, по моему мнению, функцией, которую можно допиливать под множество потребностей.
Итак думаю можно начинать.
С помощью конструкции switch можно соорудить нехитрый рубрикатор:
Таким же образом можно соорудить и поисковик, но уже естественно без switch.
Прикрутив сюда CSS, получается весьма годная визуализация, без особых заморочек.
Всем спасибо. Всегда открыт для конструктивной критики.
В целом все началось с того, что мне потребовался paginator для главной страницы создаваемого мной блога. Но, я был крайне удивлен тому, что все готовые решения, либо заточены под какую-либо CMS, либо настолько громоздки, что количество кода превышает общее количество кода самого блога. Далеко не буду ходить, думаю многим известен Pagination.ru.
Конечно же проще чем использовать MySQL LIMIT, думаю искать ничего не стоит. Идея не нова, использовалась и описывалась сотни раз, поэтому на оригинальность я не претендую, всего лишь делюсь удобной, по моему мнению, функцией, которую можно допиливать под множество потребностей.
Итак думаю можно начинать.
Структура таблицы базы данных
CREATE TABLE IF NOT EXISTS `posts` ( -- где:
`id` int(11) NOT NULL AUTO_INCREMENT, -- идентификатор (первичный ключ)
`category` varchar(20) NOT NULL, -- категория
`theme` varchar(256) NOT NULL, -- тема статьи
`post` text NOT NULL, -- текст статьи
`date` varchar(20) NOT NULL, -- дата публикации в формате UNIX
`user` varchar(20) NOT NULL, -- имя пользователя, опубликовавшего статью
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Непосредственно функция
//$table - имя таблицы
//$critery - критерий поиска в формате имя_поля=значение
//$limit - количество отображаемых статей на странице
function post($table, $critery = null, $limit = 5) {
// Линк подключения к БД
$pdo = new PDO('mysql:host=имя_хоста;dbname=имя_бд', 'имя_пользователя', 'пароль');
// Формирование критерия поиска, если критерий пуст, уточняющее WHERE не используется
$where = NULL;
if (isset($critery)) {
list($at, $vl) = explode("=", $critery);
$atribute = trim($at);
$value = trim($vl);
$where = "WHERE `$atribute` = '$value'";
}
// Отправная точка отсчета статей
$begin = isset($_GET['begin'])?intval($_GET['begin']):0;
// Основной запрос в БД
$query = "SELECT category, theme, post, date, user
FROM `$table` $where
ORDER BY `id`
DESC LIMIT ".$begin.", ".$limit;
$result = $pdo->query($query);
// Сохраняем все значения в массив
$row = $result->fetchAll(PDO::FETCH_ASSOC);
// Перебираем массив и формируем визуализацию полученных значений
if(is_array($row) ) {
foreach($row as $array) {
echo "<div id='theme'><h3>", $array['theme'], '</h3></div>';
echo "<div id='date'><h6>Posted ", date('M j, Y', $array['date']), " by ", $array['user'],"</h6></div>";
echo "<div id='post'><p>", substr($array['post'], 0, 400), '.....</p></div>';
echo "<div id='category'>", $array['category'], "<hr /></div>";
}
}
$query = "SELECT COUNT(*) as `count`
FROM `$table` " . $where;
$result = $pdo->query($query);
// Здесь мы подсчитываем сколько всего у нас статей
$count = $result->fetch(PDO::FETCH_OBJ)->count;
// Вычисляем сколько будет страниц
$pageCount = ceil($count/$limit);
$navigation = NULL;
// Формируем навигацию
for($i=0; $i<$pageCount; $i++) {
$navigation .= '<a href="index.php?begin='.($i*$limit).'">'.($i+1).'</a>';
}
echo '<div class="pagination">' . $navigation . '</div>';
}
С помощью конструкции switch можно соорудить нехитрый рубрикатор:
switch ($_GET['id']) {
// Таких рубрик может быть сколь угодно
case 'PHP':
post('posts', 'category=PHP');
break;
case 'CSS':
post('posts', 'category=CSS');
break;
// Ну и дефолтовое значение вывод всех статей. Первой будет последняя опубликованная
default: post('posts');
break;
}
Таким же образом можно соорудить и поисковик, но уже естественно без switch.
Прикрутив сюда CSS, получается весьма годная визуализация, без особых заморочек.
Всем спасибо. Всегда открыт для конструктивной критики.