воскресенье, 6 марта 2011 г.

Добавляем на сайт постраничный вывод комментариев, статей и т.п.

Доброго времени суток!
Предположим, страница, отвечающая за отображение статьи получает GET-методом id выводимой статьи в переменную art_id. (потом к ней еще добавим переменную page, для хранения номера целевой страницы, но это в самом конце, когда будем делать ссылки)
Вот, предположим, вывели статью из базы:


$link = connect();
mysql_select_db('dbase',$link);
$result = mysql_query('SELECT id,title,article FROM arts WHERE id ='.$_GET['art_id'],$link);
$arts = mysql_fetch_array($result);
echo '<div class='article'>';
if($arts['private']){
if($reg_user->user_perm->art_priv){
echo '<H2>'.$arts['title'].'</H2>';
echo '<p>'.$arts['article'].'</p>';
}
}else{
echo '<H2>'.$arts['title'].'</H2>';
echo '<p>'.$arts['article'].'</p>';
}
echo '</div>';


В пояснениях вряд ли нуждается. Теперь посчитаем комментарии, к этой статье. Хранятся в базе в таблице comments с полями: id комментария, id статьи, ник комментатора, дата.


$result = mysql_query('SELECT id FROM comments WHERE art_id ='.$_GET['art_id'],$link);
$all = mysql_num_rows($result);

Зададим количество комментариев на странице:
$com_on_page = 5;

Теперь делаем следующее:


if($all > $com_on_page){ // если комментарием больше, чем на одну страницу
// *тогда и появляется смысл постраничного вывода*,
// иначе просто циклический вывод без заморочек.
// Обратите внимание, иф закрывается в самом конце!
$all_pages = ceil($all/$com_on_page); // считаем кол-во страниц (округлим к большему)
if(isset($_GET['page'])) { // В последствии будем передавать номер текущей страницы через переменную page
$tek_page = $_GET['page']; // Определяем номер текущей страницы
$tek = $tek_page * $com_on_page - $com_on_page + 1; // Определяем номер первого комментария на странице
}else { // Если мы только-только сюда перешли, то логично, что мы начинаем с
//первой страницы...хотя, по желанию можно и поставить $all - с конца
$tek_page = 1;
$tek = 1;
}
echo 'Всего комментариев: '.$all; // Вывод для красоты и порядка
echo '<br>Страница: '.$tek_page;
// if продолжается...

Теперь представим так:
Пусть кружки - комментарии. Пусть на странице их по два. Снизу номера страниц. Чтобы не заморачиваться с MySQL командой LIMIT и упорядочиванием в базе введем такую идею: через fetch array вытаскиваем все, но ОТОБРАЖАЕМ только с $tek до $tek+$com_on_page, т.е. ровно одну страницу. Для этого нужно учесть некий счетчик-переменную $i, то так будет:


$result = mysql_query('SELECT * FROM comments WHERE art_id ='.$_GET['art_id'],$link);
$i=1;
while($com = mysql_fetch_array($result)){
if(($i >= $tek)&& ($i <= ($tek_page*$com_on_page))){
echo '<div class='article'>';
echo 'Написал: '.$com['nick'].'<br>'.'Дата: '.$com['date'].'<br>';
echo '<a href='del_comment.php?del_com_id='.$com['id'].''>Удалить</a><br>'; // Сразу ссылка на скрипт удаления
echo $com['com'].'<br>-----------------------------------------<br>';
echo '</div>';
}
$i++;
}


Ну теперь сами ссылки непосредственно. У меня оно в виде <<  <   >  >> при желании можно модифицировать

echo '<a href='art_view.php?page='.'1'.'&art_id='.$_GET['art_id'].''>&lt;&lt;</a>'; // На первую страницу
echo '&nbsp;&nbsp;&nbsp;';

if($tek_page > 1)
echo '<a href='art_view.php?page='.($tek_page-1).'&art_id='.$_GET['art_id'].''>&lt;</a>'; // На одну страницу назад
else
echo '<a href='art_view.php?page='.$tek_page.'&art_id='.$_GET['art_id'].''>&lt;</a>';
echo '&nbsp;&nbsp;&nbsp;';

if(($all_pages > 1)&&($all_pages != $tek_page))
echo '<a href='art_view.php?page='.($tek_page+1).'&art_id='.$_GET['art_id'].''>&gt;</a>';// На одну страницу вперед
else
echo '<a href='art_view.php?page='.$tek_page.'&art_id='.$_GET['art_id'].''>&gt;</a>';
echo '&nbsp;&nbsp;&nbsp;';

echo '<a href='art_view.php?page='.$all_pages.'&art_id='.$_GET['art_id']."'>&gt;&gt;</a>"; // На последнюю страницу
} // Здесь у нас заканчивается тот самый длинный if($all > $com_on_page).
else{ // Если комментариев меньше полной страницы
echo 'Всего комментариев: '.$all;
echo '<br>Страница: 1';
$result = mysql_query('SELECT * FROM comments WHERE art_id ='.$_GET['art_id'],$link);
while($com = mysql_fetch_array($result)){
echo '<div class='article'>';
echo 'От: '.$com['nick'].'<br>'.'Дата: '.$com['date'].'<br>';
echo '<a href='del_comment.php?del_com_id='.$com['id'].''>Удалить</a><br>';
echo $com['com'].'<br>-----------------------------------------<br>';
echo '</div>';
}
}


Итак, если вы запаслись терпением, то весь код страницы:


<?php
/*--------------------------
Подключаемые библиотеки
----------------------------*/
include('lib/base_connect.php');
include('lib/user.php');
/*==========================*/
?>
<?php include('lib/reg_user.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Статья</title>
<link href="style/main.css" rel="stylesheet" type="text/css" />
<link href="style/arts.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="main_frame">
<?php include('blocks/header.php'); ?>
<?php include('blocks/navi.php'); ?>
<div id="line"></div>
<div id="body">
<!-- Блок инфомации -->
<?php
if(isset($_GET['art_id'])){
$link = connect();
mysql_select_db('dbase',$link);
$result = mysql_query('SELECT id,title,article FROM arts WHERE id ='.$_GET['art_id'],$link);
$arts = mysql_fetch_array($result);
echo '<div class='article'>';
if($arts['private']){
if($reg_user->user_perm->art_priv){
echo '<H2>'.$arts['title'].'</H2>';
echo '<p>'.$arts['article'].'</p>';
}
}else{
echo '<H2>'.$arts['title'].'</H2>';
echo '<p>'.$arts['article'].'</p>';
}
echo '</div>';

$result = mysql_query('SELECT id FROM comments WHERE art_id ='.$_GET['art_id'],$link);
$all = mysql_num_rows($result);

$com_on_page = 5; // Количество записей на страницу

//echo $all.' '.$com_on_page;

if($all > $com_on_page){
$all_pages = ceil($all/$com_on_page); // считаем кол-во страниц (округлим к большему)
if(isset($_GET['page'])) {
$tek_page = $_GET['page']; // Определяем номер текущей страницы
$tek = $tek_page * $com_on_page - $com_on_page + 1; // Определяем номер первого комментария на странице
}
else {
$tek_page = 1;
$tek = 1;
}
echo 'Всего комментариев: '.$all;
echo '<br>Страница: '.$tek_page;

$result = mysql_query('SELECT * FROM comments WHERE art_id ='.$_GET['art_id'],$link);

$i=1;
while($com = mysql_fetch_array($result)){
if(($i >= $tek)&& ($i <= ($tek_page*$com_on_page))){
echo '<div class='article'>';
echo 'От: '.$com['nick'].'<br>'.'Дата: '.$com['date'].'<br>';
echo '<a href='del_comment.php?del_com_id='.$com['id'].''>Удалить</a><br>';
echo $com['com'].'<br>-----------------------------------------<br>';
echo '</div>';
}
$i++;
}
echo '<a href='art_view.php?page='.'1'.'&art_id='.$_GET['art_id'].''>&lt;&lt;</a>'; // На первую страницу
echo '&nbsp;&nbsp;&nbsp;';

if($tek_page > 1)
echo '<a href='art_view.php?page='.($tek_page-1).'&art_id='.$_GET['art_id'].''>&lt;</a>'; // На одну страницу назад
else
echo '<a href='art_view.php?page='.$tek_page.'&art_id='.$_GET['art_id'].''>&lt;</a>';
echo '&nbsp;&nbsp;&nbsp;';

if(($all_pages > 1)&&($all_pages != $tek_page))
echo '<a href='art_view.php?page='.($tek_page+1).'&art_id='.$_GET['art_id'].''>&gt;</a>';// На одну страницу вперед
else
echo '<a href='art_view.php?page='.$tek_page.'&art_id='.$_GET['art_id'].''>&gt;</a>';
echo '&nbsp;&nbsp;&nbsp;';

echo '<a href='art_view.php?page='.$all_pages.'&art_id='.$_GET['art_id']."'>&gt;&gt;</a>"; // На последнюю страницу
}
else{ // Если комментариев меньше полной страницы
echo 'Всего комментариев: '.$all;
echo '<br>Страница: 1';
$result = mysql_query('SELECT * FROM comments WHERE art_id ='.$_GET['art_id'],$link);
while($com = mysql_fetch_array($result)){
echo '<div class='article'>';
echo 'От: '.$com['nick'].'<br>'.'Дата: '.$com['date'].'<br>';
echo '<a href='del_comment.php?del_com_id='.$com['id'].''>Удалить</a><br>';
echo $com['com'].'<br>-----------------------------------------<br>';
echo '</div>';
}
}
if(isset($reg_user))
echo // Если у нас пользователь авторизовался, то он сможет добавить комментарий.
"<form class="body" action='add_comment.php' method="post">
<input type="hidden" name="art_id" id="art_id" value="".$_GET['art_id']."" />
<textarea name='com' id='com' name='com' cols="30" rows="5"></textarea>
<br><input type="submit" value="Добавить комментарий" />
</form>";
}
?>
<!-- Конец блока инфомации -->
</div>
<?php include('blocks/footer.php'); ?>
</div>
</body>
</html>

Комментариев нет:

Отправить комментарий