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

pavlodaranet

Новичок
поставил предупреждение об ошибках, теперь дэнвер жалуется на строчки

PHP:
$page=$_GET['page']; 
$cat=$_GET['cat'];
Undefined index: page и cat
 

pavlodaranet

Новичок
заменил на

PHP:
if (isset($_GET['page'])) {$page=$_GET['page'];}
// категория  
if (isset($_GET['cat'])) {$cat=$_GET['cat'];}
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
$page = isset($_GET['page'])?$_GET['page']:1;
-~{}~ 25.12.08 11:15:

где 1 - значение по умолчанию, если такой параметр не передан. Для страниц, это, очевидно 1.
 

pavlodaranet

Новичок
Теперь необходимо:

1) Осуществить проверку на наличие параметра cat в БД
2) Защита $cat ф-цией intval

Если с этим примерно имею представление как бороться, то как быть с этим:

- Что будет, если в url надо будет передать еще параметры, кроме cat и page ?
- Что будет, если ты обьявишь констату cnt, скажем, в /blocks/bd.php ?

-~{}~ 25.12.08 11:38:

Еще после вызова ...news/?cat=0&page=1 вылезли следующие ошибки:

Notice: Use of undefined constant cnt - assumed 'cnt' in Z:\home\test.ua\www\news\index.php on line 26

PHP:
// Общее число сообщений 
$cat=$_GET['cat'];
$q="SELECT count(*)  as cnt  FROM news where catid=$cat";
$result=mysql_query($q);
$row=mysql_fetch_assoc($result);
$posts=$row[cnt]; //26 строка

PHP:
// Нужны ли стрелки назад   
	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; //59 строка
}
во втрором случае как я понимаю надо условие вывода с if-ом делать?
 

x-yuri

Новичок
- Что будет, если ты обьявишь констату cnt, скажем, в /blocks/bd.php ?
Notice: Use of undefined constant cnt - assumed 'cnt' in Z:\home\test.ua\www\news\index.php on line 26
$posts=$row[cnt]; //26 строка
ты указал в качестве индекса массива не число и не строку, пхп решил, что это константа. Но так как такой константы он не нашел, то он воспринял cnt как строку, но выдал при это notice. Если ты объявишь константу cnt, то она будет использоваться в качестве индекса массива, и если она не будет равна 'cnt', то твой скрипт перестанет корректно работать

-~{}~ 25.12.08 09:11:

во втрором случае как я понимаю надо условие вывода с if-ом делать?
какой второй случай?

-~{}~ 25.12.08 09:12:

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

pavlodaranet

Новичок
второй случай:

присвоил переменным пусто значение, а потом вывел их, уже с проверкой :

PHP:
	// Вывод 
	if(!empty($pervpage)) echo $pervpage;
	if(!empty($page2left)) echo $page2left;
	if(!empty($page1left)) echo $page1left;	
	echo '<b>'.$page.'</b>';
	if(!empty($page1right)) echo $page1right;
	if(!empty($page2right)) echo $page2right;
	if(!empty($nextpage)) echo $nextpage;
 

x-yuri

Новичок
лучше чтобы эти переменные в любом случае определелись
т.е. не
PHP:
if ($page != 1) 
    $pervpage = '<a href="./?page=1&cat='.$cat.'">&lt;&lt;</a>    
                     <a href="./?page='.($page - 1).'&cat='.$cat.'">&lt;</a> ';
а
PHP:
$pervpage = ($page != 1 
    ? '<a href="./?page=1&cat='.$cat.'">&lt;&lt;</a>    
        <a href="./?page='.($page - 1).'&cat='.$cat.'">&lt;</a> ' 
    : '' );
тогда ты избешишь ifов, которые ты добавил
p.s. эти ifы нужны были в любом случае, даже в первом случае, хотя я не знаю о чем ты))
p.p.s. чего ты содержимое href через пробел и не в кавычках указываешь?
 

pavlodaranet

Новичок
2x-yuri как я и говорил, код отрыт в инете :)
Пока делал по принципу работает - не трожь! :)
Сейчас поменяю по стандартам.

-~{}~ 26.12.08 11:25:

вот собственно и код. вроде как учел основные замечания. что еще критичного в коде?

PHP:
<?php
error_reporting(E_ALL);//показывать все ошибки
// соединение с базой данных
include ("../blocks/bd.php");
// Кол-во на страницы 
$num = 2;   
// Текущая страница 
$page = isset($_GET['page'])?$_GET['page']:1;
//1 - значение по умолчанию, если такой параметр не передан. 

// Если не существует в URL параметр CAT, то выводить основную страницу раздела "Новости"
if (!isset($_GET['cat']))
{
	//здесь надо выводить главную страницу раздела новости
}
//***************************************************************************************
// Если существует в URL параметр CAT, то выводить постранично из категории
else
	{
   	// Общее число сообщений 
	
	$row=mysql_fetch_assoc(mysql_query("SELECT count(*)  as cnt  FROM news where catid = '".intval($_GET['cat'])."'"));
     if($row['cnt']) //Если параметр cat существует в БД
	 	{ 
		$cat=intval($_GET['cat']);
    	$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>";
			}   
 		$pervpage='';
		$nextpage='';
		$page2left='';
		$page1left='';
		$page2right='';
		$page1right='';
		// Нужны ли стрелки назад  
		if ($page != 1) $pervpage = "<a href='./?page=1&cat=".($cat)."'>&lt;&lt;</a>
									 <a href='./?page=".($page - 1)."&cat=".($cat)."'>&lt;</a> ";  							    
		// Нужны ли стрелки вперед   
		if ($page != $total) $nextpage =" <a href='./?page=".($page + 1)."&cat=".($cat)."'>&gt;</a>   
       	                            <a href='./?page=".$total."&cat=". ($cat)."'>&gt;&gt;</a>";   
		// Стр. с обоих краев 
		if($page - 2 > 0) $page2left ="<a href='./?page=".($page - 2)."&cat=".($cat)."'>".($page - 2)."</a>&zwnj;"; 
	  
		if($page - 1 > 0) $page1left = "<a href='./?page=".($page - 1)."&cat=".($cat)."'>".($page - 1)."</a>&zwnj;";   
		if($page + 2 <= $total) $page2right = "&zwnj;<a href='./?page=".($page + 2)."&cat=".($cat)."'>".($page + 2)."</a>";   
		if($page + 1 <= $total) $page1right = "&zwnj;<a href='./?page=".($page + 1)."&cat=".($cat)."'>".($page + 1)."</a>"; 
		// Вывод 
		if(!empty($pervpage)) echo $pervpage;
		if(!empty($page2left)) echo $page2left;
		if(!empty($page1left)) echo $page1left;	
		echo '<b>'.$page.'</b>';
		if(!empty($page1right)) echo $page1right;
		if(!empty($page2right)) echo $page2right;
		if(!empty($nextpage)) echo $nextpage;
		}
		else header('HTTP/1.0 404 Not Found');//Если передать в параметре cat идетификатор, для которого нет на самом деле раздела
	}
?>
 

x-yuri

Новичок
error_reporting(E_ALL);//показывать все ошибки
стоит в настройки пхп перенести

используй функции
function news_count( $cat_id ) - возвращает количество новостей
function news_get( $cat_id, $start, $num ) - возвращает список новостей
function paginator() - выводит пагинатор
тогда можно будет написать
PHP:
$news = news_get( $cat_id, $start, $num );
foreach( $news as $new ) {
    echo '<table> 
              <tr> 
                  <td ><p><a href="view_news.php?id='.$new['id'].'">'.$new['title'].'</a></p> 
                  </td> 
              </tr> 
          </table>';
}
используй " вместо ' для ограничения значений атрибутов (<a href="#" ...>)

если у тебя переменным $pervpage, $page2left, $page1left, $page1right, $page2right,$nextpage наверняка присвоено значение, зачем ты все еще проверяешь это? пиши
PHP:
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
404 надо выдавать, если $page > $total или $page < 1

-~{}~ 26.12.08 08:42:

возможно имеет смысл вывод новостей категории и вывод главной страницы вынести в отдельные файлы
 

x-yuri

Новичок
по поводу несуществующих страниц в пагинаторе, появилась идея: если страница не существует можно выдать последнюю, но при этом послать код 404 Not Found
как вам такая идея?
 
Сверху