Блок "Новости" и постраничная навигация с категориями

Иван 76

Новичок
если у сайта правильная архитектура, то в любой момент, если обнаружена ошибка входных данных, можно подменить выводимую страницу, и вместо заголовка "по вашему запросу отсутствуют данные в БД" показывать красивую, правильно-оформленную страницу ошибки 404, с навигацией, которая позволит пользователю легко перейти на тот раздел сайта, который его интересует. Часто на страницах 404 делают поисковую форму.

Есть как сторонники, так и противники такого решения.

http://yandex.ru/sdfgf
http://www.rambler.ru/sfgdfg.html
http://www.artlebedev.ru/studisdfg/
 

nalim

Новичок
эта тема - нечто наподобие батл зон в РПГ?
специально для "прокачки"?
человек спросил как ему сделать редирект
ответ: учи HTTP )
дальнейшая дискуссия имеет какоето отношение к вопросу?)
 

pavlodaranet

Новичок
тут офтоп пошел помоему.
кстати, давайте глянем, как форум сделан:
http://phpclub.ru/talk/showthread.php?threadid=112118&perpage=20&pagenumber=777

ничего не напоминает?
как сделаю, то на суд пхпшный вынесу код :)
 

Иван 76

Новичок
nalim
Ты хоть прочитал сообщения в этом топике?
Человек сюда пришел чтоб научиться "правильно" делать сайты, а именно - постраничный вывод.
Абсолютно все сообщения этого топика имеют прямое отношение к правильной организации пагинатора. Так же как и каждая страница сайта, которая содержит пагинатор, имеет непосредственное отношение к http.
Кстати, процитируй плиз
>учи HTTP )
, или укажи первоисточник.

И, кстати, если в этом топике хоть одно сообщение и не имеет отношения к пагинатору, - так это твое.
 

pavlodaranet

Новичок
в общем хочу сделать так:

$cat=$_GET['cat'];

if (!isset($_GET['cat']))
тогда делаю выборку 5 последних новостей и вывожу списком без всяких пагинаторов

если же существует, то запрос вроде такого:
SELECT * FROM news WHERE cat=$cat ORDER BY id desc LIMIT $start, $num

далее вывод информации, а затем формирую вывод пагинатора с сылками содержащими параметр cat
.../news/?page=1&cat=1

Ваши комментарии?
 

Иван 76

Новичок
Да можно и так, только
$cat=$_GET['cat'];
if (!isset($_GET['cat']))

Надо поменять местами, чтоб нотисы не сыпались
 

pavlodaranet

Новичок
но теперь получается проблема с подсчетом количества записей т.к. появляются категории
 

Иван 76

Новичок
$result = mysql_query("SELECT * FROM news ");
$posts = mysql_num_rows($result);
- Это решение приемлемо только на первое время. Потом его надо будет заменить хотя бы на count().

А лучше SELECT SQL_CALC_FOUND_ROWS * + SELECT FOUND_ROWS();

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

-~{}~ 24.12.08 12:33:

Изучи то что по ссылке, и проблем с категориями не будет.
 

pavlodaranet

Новичок
Я говорил про конечный результат. тот что учить надо - тут советчики сильно не нужны, сам знаю.
А вот те, кто дельную идею подкинуть могут и указать на нить Ариадны, тем огромное спасибо.
 

Иван 76

Новичок
pavlodaranet
Делай так как считаешь нужным, - это самое важное.
Ты это все делаешь только ради того, чтоб научиться разрабатывать. Потом все равно все переделаешь (если только пишешь не для клиента, а для себя).
Лично я пользуюсь http://framework.zend.com/manual/en/zend.paginator.html
Но это мое мнение и только. Другим нравится Symfony, или Drupal, или CakePHP или еще что-то.
Новички нередко начинают с http://codeigniter.com/ (там есть и пагинатор, и много чего), т.к. он легок в освоении, - потом переходят на что-то более серьезное.
 

pavlodaranet

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

-~{}~ 24.12.08 17:16:

Вот, как и обещал код, прокомментируйте что еще надо поправить:

PHP:
<?php
// соединение с базой данных
include ("../blocks/bd.php");
// Кол-во на страницы 
$num = 2;   
// Текущая страница 
$page=$_GET['page']; 
// категория  
$cat=$_GET['cat'];

// Если не существует в URL параметр CAT, то выводить основную страницу раздела "Новости"
if (!isset($_GET['cat']))
{
	//здесь надо выводить главную страницу раздела новости
	 
}
//***************************************************************************************
// Если существует в URL параметр CAT, то выводить постранично из категории
else
	{
   	// Общее число сообщений 
	$q="SELECT count(*)  as cnt  FROM news where catid=$cat";
	$result=mysql_query($q);
    $row=mysql_fetch_assoc($result);
    $posts=$row[cnt];
	// Общее число страниц   
	$total = intval(($posts - 1) / $num) + 1;   
	// Начальная позиция отсчета 
	$page = intval($page);   
	// Если $page отрицательно то, переходим на первую страницу 
	if(empty($page) or $page < 0) $page = 1;   
	if($page > $total) $page = $total;   
	// С какого номера начать выводить сообщения 
	$start = $page * $num - $num; 
	$result = mysql_query("SELECT * FROM news WHERE catid=$cat ORDER BY id desc LIMIT $start, $num");
	while ( $postrow[] = mysql_fetch_array($result)) ;
	for($i = 0; $i < $num; $i++)   
		{   
 		echo "<table>
        	        <tr>
            		<td ><p><a href='view_news.php?id=".$postrow[$i]["id"]."'>".$postrow[$i]["title"]."</a></p>
               		</td>
	                </tr>
     	     </table>";
		}   
 	// Нужны ли стрелки назад   
	if ($page != 1) $pervpage = '<a href= ./?page=1&cat='. ($cat).'><<</a>   
                               <a href= ./?page='. ($page - 1) .'&cat='. ($cat).'><</a> ';   
	// Нужны ли стрелки вперед   
	if ($page != $total) $nextpage = ' <a href= ./?page='. ($page + 1) .'&cat='. ($cat).'>></a>   
                                   <a href= ./?page=' .$total. '&cat='. ($cat).'>>></a>';   
	// Стр. с обоих краев 
	if($page - 2 > 0) $page2left = ' <a href= ./?page='. ($page - 2) .'&cat='. ($cat).'>'. ($page - 2) .'</a> | ';   
	if($page - 1 > 0) $page1left = '<a href= ./?page='. ($page - 1) .'&cat='. ($cat).'>'. ($page - 1) .'</a> | ';   
	if($page + 2 <= $total) $page2right = ' | <a href= ./?page='. ($page + 2) .'&cat='. ($cat).'>'. ($page + 2) .'</a>';   
	if($page + 1 <= $total) $page1right = ' | <a href= ./?page='. ($page + 1) .'&cat='. ($cat).'>'. ($page + 1) .'</a>'; 
	// Вывод 
	echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
}
?>
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Что будет, если передать в параметре cat идетификатор, для которого нет на самом деле раздела?

-~{}~ 24.12.08 17:19:

Что будет, если в url надо будет передать еще параметры, кроме cat и page ?
 

pavlodaranet

Новичок
Косяк будет :) Проверки пока не лепил, но это учту.
Потом и другие проверки нужны дабы избежать SQL иньекций, правильно понимаю?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
что будет, если ты обьявишь констату cnt, скажем, в /blocks/bd.php ?

-~{}~ 24.12.08 17:23:

дабы избежать SQL иньекций
у тебя от иньекций $page защищена intval в этом конкретном случае в твоем коде. $cat — не защищена.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Какую из? Иньекции? Я к счастью, пользуюсь PDO, а в нем — prepared statements, поэтому про иньекции не думал уже давно.

В по теме — http://phpfaq.ru/slashes

-~{}~ 24.12.08 17:35:

Антон, если я не ошибаюсь? )
 

pavlodaranet

Новичок
он самый, знакомы? :)

в случае про инъекции в моём случае достаточно $cat защитить intval ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
он самый, знакомы?
Заочно. :) Олег Горбунов. Меня Кидом часто кличут в Павлодаре.
От инъекции нужно защищать все переменные, полученные от пользователя. Но задача решается более глобально: т.к. тебе нужно все переменные, использованные в запросе, экранировать от служебных символов, а SQL-иньекция, по сути, это и есть намеренная передача служебных символов в данных, для получения не планируемого тобой результата, задача приходит просто к экранированию переменных. :)
Правда, еще есть XSS атаки, JS-injection, это тоже надо обрабатывать, но пока речь не об этом. :)

По ссылке выше хорошо написано.
 
Сверху