Предлагаю скрипт постраничного вывода.

Лексеич

Московский калмык
Предлагаю скрипт постраничного вывода.

Написал себе сегодня. Может еще кому пригодится. Критика приветствуется.

url вида: http://www.mysite.ru/log.php?id=1&pid=4

PHP:
session_start();
include "sess_check.php"; // авторизован?

// Проверка ГЕТов
if (!$_GET['id'])
{
	$id = $_SESSION['user_id'];
}
else
{
	$id = (integer)$_GET['id'];
};

if (!$_GET['pid'])
{
	$pid = 1;
}
else
{
	$pid = (integer)$_GET['pid'];
};

// Общее число записей
$res      = mysql_query("SELECT COUNT(f_id) FROM tab1 WHERE pers_id = \"$id\"");
$record = mysql_fetch_array($res); 
$logs_num  = $record[0];
// Записей на страницу:
$recs_per_page = 30;
// Число страниц:
$page_max = $logs_num%$recs_per_page;

if ($pid <= 0 or $pid > $page_max) // проверка ИД страницы на соответствие интервалу
{
	$pid = 1;
};

// Записей на последней странице:
$last_page_recs_num = $logs_num-$recs_per_page*($page_max-1);
// Значение для "LIMIT'a"
$limit_from = ($pid-1)*$recs_per_page;

// Выборка записей для данной страницы
if ($pid == $page_max) // для ПОСЛЕДНЕЙ
{
	$logs_to_page_query = mysql_query("SELECT f_id, pers_id, end, time_f FROM tab1 WHERE pers_id = \"$id\" AND end != 0  ORDER BY time_f DESC LIMIT $limit_from,$last_page_recs_num");
	$show_recs = $last_page_recs_num; // используем при выводе
}
else // для НЕ ПОСЛЕДНЕЙ
{
	$logs_to_page_query = mysql_query("SELECT f_id, pers_id, end, time_f FROM tab1 WHERE pers_id = \"$id\" AND end != 0  ORDER BY time_f DESC LIMIT $limit_from,$recs_per_page");
	$show_recs = $recs_per_page; // используем при выводе
};

// Логин перса
$pers = mysql_fetch_array(mysql_query("SELECT login FROM user WHERE id = \"$id\""));

// Формируем номера страниц вида: <<предидущая 3 следующая>>

if ($logs_num > $recs_per_page) // а нужны ли они вообще?
{
	if ($pid > 1) // ссылка на первую страницу
	{
		echo '<a href="log.php?id='.$id.'&pid='.($pid-1).'"><<предидущая</a>&nbsp;';
	};

	echo $pid; // текущая

	if ($pid < $page_max) // ссылка на последнюю страницу
	{
		echo '&nbsp;<a href="log.php?id='.$id.'&pid='.($pid+1).'">следующая>></a>';
	};
};
//----------Конец формирования номеров

// Вывод записей на страницу
echo '<br>';
for ($i=0; $i<$show_recs; $i++)
{
	$record = mysql_fetch_array($logs_to_page_query);
	echo '<a href="user_result.php?ew='.$record[f_id].'" class="hder3">'.date("m.d.y | H:i:s",$record[time_f]).'</a> '.$pers[login].' vs bot. ';
	if ($record[end] == 1) echo 'на один';
	if ($record[end] == 2) echo 'на два';
	if ($record[end] == 3) echo 'на три';
	echo '<br>';
};
 

Sizz

Новичок
PHP:
// Общее число записей 
$res      = mysql_query("SELECT COUNT(`f_id`) FROM `tab1` WHERE `pers_id` = '$id' "); 

$record = mysql_fetch_array($res); 

$logs_num  = $record[0];
 

Sizz

Новичок
и что, теперь работает?
$logs_num = mysql_num_rows($logs);
теперь ведь $logs_num всегда 1 равен


эти 3 строки которые я написал заменяют твои 2:

PHP:
$logs      = mysql_query("SELECT f_id FROM tab1 WHERE pers_id = \"$id\""); 
$logs_num  = mysql_num_rows($logs);
 

Лексеич

Московский калмык
Sizz
ты прав. Исправляю. Насколько я понимаю так быстрее будет работать при большом объеме данных?

Автор оригинала: Sizz
и что, теперь работает?
$logs_num = mysql_num_rows($logs);
теперь ведь $logs_num всегда 1 равен
эти 3 строки которые я написал заменяют твои 2
не сразу понял смысл. ;)
 

Sizz

Новичок
Лексеич
да, быстрее.
результатом запроса будет не все строки из таблицы,
а всего одна строка с количеством нужных тебе строк.
только если в какой-то записи f_id равен NULL она считаться не будет
 

Лексеич

Московский калмык
Sizz
ага, спасибо. :)

з.ы. на письмо можешь не отвечать. хватит и этого ответа. ;)
 

Лексеич

Московский калмык
Фанат
гы. прикольно. а вот юзал я поиск по форуму на готовый скрипт, так всех отправляли в поиск, нихде нифига нету. :) тока воду льют..(собсна поэтому и выложил)..
и тебе везде фпадлу страждущим эту сцылку дать было. %)

ну да ничего.. зато мозгами пошевелил (я всмысле). :)


з.ы. если выкинуть всё лишнее, то у меня не на много то и больше код. %Ь
 

Фанат

oncle terrible
Команда форума
Да, мозгами всегда полезно.
Впадлу именно поэтому - что шевелить надо самому.
Уж хотя бы алгоритм человек должен сам соображать.
А остальное - это оптимизация и украшения.
Тем более, что самый первый скрипт постраничного вывода, который я написал на этот форум, ненамного отличался от твоего, а то, что по ссылке - плод многих раздумий и экспериментов.

Впрочем, и сейчас есть идеи, что там можно улучшить.
 

Лексеич

Московский калмык
Всегда надо стремиться к совершенству.. Собсна это уже оффтоп.
 

Groove

Новичок
Раз пошла такая пьянка...

Собственно тогда и я свой выложу пейджер :D
может быть тоже кому сгодится...
PHP:
<?php
// +----------------------------------------------------------------------+
// | PHP version 4.3.x                                                    |
// +----------------------------------------------------------------------+
// | Copyright (c) Berdnikov Alexey                                       |
// +----------------------------------------------------------------------+
// |                    Pager Engine for PHP                              |
// |                                                                      |
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | [url]http://www.php.net/license/2_02.txt.[/url]                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | [email][email protected][/email] so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Berdnikov Alexey <[email protected]>                           |
// |                                                                      |
// +----------------------------------------------------------------------+
//// $Id: pager.class.php,v 1.6 2005/04/15 11:44:56 groove Exp $

 /*
 * можете использовать картинки для перехода на следующую и предыдущие страницы изменив эти константы
 * define('CFG_PAGE_NEXT_NAME','<img alt=">>" border=0 src="/images/b_next.gif">');
 * define('CFG_PAGE_NEXT_NAME_UNACT','<img alt=">>" border=0 src="/images/d_next.gif">');
 * define('CFG_PAGE_PREV_NAME','<img border=0 src="/images/b_prev.gif" alt="<<">');
 * define('CFG_PAGE_PREV_NAME_UNACT','<img border=0 src="/images/d_prev.gif" alt="<<">');
 */ 

  //следующая активная
  define('CFG_PAGE_NEXT_NAME',       '&raquo;');
  //следующая не активная
  define('CFG_PAGE_NEXT_NAME_UNACT', '&raquo;');
  //предыдущаая активная
  define('CFG_PAGE_PREV_NAME',       '&laquo;');
  //предыдущаая не активная
  define('CFG_PAGE_PREV_NAME_UNACT', '&laquo;');
  //максимальное количество элементов пейджинга на странице
  //ведь страниц может быть и тысяча, если их все выводить, то это займет много места
  define('CFG_PER_PAGE_MAX_ITEM',     10); 

// просто ради namespace
class CPager{

	/**
	 * Формирует код типа << 1 ... 10 11 [12] 13 14 ... 1000 >>
	 *
	 * @param int $cnt_items количество страниц   (получается извне, чтобы не привязывать пейджер к конкретной области)
	 * @param int $per_page  объектов на страницу (например 5 новостей на одну страницу)
	 * @param string $url    базовый URL (может быть произвольного вида, с параметрами и без)
	 * @return string
	 */
	function get_code($cnt_items=1,$per_page=1,$url="/"){
	  //вычислим номер текущей страницы
		$curr       = isset($_GET['page']) ? abs(intval($_GET['page'])) : 0;
		//вычисли номер предыдущей страницы
		$prev       = $curr-1;
		//вычислим количество страниц
		$cnt_pages  = ceil($cnt_items/$per_page); 
		//вычислим номер следующей страницы
		$next       = ($curr<$cnt_pages) ? $curr+1 : $curr;
		//переопределим базовый URL в зависимости от того, с параметрами ли он или без
		$pos = (strpos($url,'?'));
		$base_url   = ($pos===false) ? trim(htmlentities($url)).'?' : trim(htmlentities($url)).'&';
		//если всего одна страницы, то не будем показывать пейджер
	  if($cnt_pages<2) return ' ';
	  //код для перехода на предыдущую страницу
		$prev_str   = ($curr==0) ? CFG_PAGE_PREV_NAME_UNACT : sprintf(' <a href="%spage=%d">%s</a> ', 
		              $base_url,$prev,CFG_PAGE_PREV_NAME);
	  //код для перехода на следующую страницу
		$next_str   = ($next==$cnt_pages) ? CFG_PAGE_NEXT_NAME_UNACT : sprintf(' <a href="%spage=%d">%s</a> ', 
		              $base_url,$next,CFG_PAGE_NEXT_NAME);
		//все , что между << и >>
		$curr_str=' ';
		//будем показывать не все страницы а только вокруг текущей в заданном диапазоне CFG_PER_PAGE_MAX_ITEM
		//с этой страницы
		$start  = (($curr-ceil(CFG_PER_PAGE_MAX_ITEM/2)) >=0) ? ($curr-ceil(CFG_PER_PAGE_MAX_ITEM/2)) : 0;
		//по эту страницу
		$finish = (($start+CFG_PER_PAGE_MAX_ITEM)<$cnt_pages) ? ($start+CFG_PER_PAGE_MAX_ITEM) : $cnt_pages;
		for($i=$start;$i<$finish;$i++){
		  $text_to=((($i+1)*($per_page+1))-1);
		    //текущую страницу выделим жирным и квадратными скобками
		    if(($i==$curr)){
		      $curr_str .=  '&nbsp;<b>['.($i+1).']</b>&nbsp;</span> ';
		    } else {
  		    //остальные никак не будем выделять
		      $curr_str .=  sprintf('&nbsp;<a href="%spage=%d">%s</a>&nbsp;', $base_url,$i,($i+1));
		    }
				 
		}
		//если последняя страница не входит в диапазон показываемых номеров страниц - все равно ее покажем
		if(($cnt_pages-1)>$finish){
				$curr_str .= sprintf('...<a title="Последняя страница" href="%spage=%d"><span class=pager>%d</span></a> ', 
				              $base_url,$cnt_pages-1,$cnt_pages);
		}
		//если первая страница не входит в диапазон показываемых номеров страниц - все равно ее покажем
		if($start!=0){
				$curr_str = sprintf('<a title="Первая страница" href="%spage=%d">%d</a>...', $base_url,0,1).$curr_str;
		}
		return '<center>'.$prev_str.'&nbsp;'.$curr_str.'&nbsp;'.$next_str.'</center>';
	}
	
}


// Использование пейджера:
// получите количество страниц, задайте сколько на одной странице выводить элементов и URL, 
// к которому будет дописываться переменная page
print CPager::get_code(1000,5,'http://sitename.com/?m=job');
print CPager::get_code(1000,5,'?m=news');
print CPager::get_code(1000,5);
print CPager::get_code(1000,5,'/admin/index.php');
?>
Кстати, какая сегодня дата замечательная и красивая
05/05/05
 

betik

Новичок
А ф чом прикол с этим скриптом?
Неужели раньше никогда не приходилось делать?..

А у меня голубая мечта есть.. Написакть свою стандартную (для меня) библиотеку.. в которой, в частности, будет ентот вот пагинатор.. Дааа... Дада. И чтоб не рыться в старых проектах.. И чтобы просто MakePagesHere()... Now.. Fuckin...Shit...
Да... Да.. Точно. Дааа... Да... Даааа... Прийдётся и звпросы стантартизировать на предмет limit... да.. вот бы было замечательно... бац и всё... бац и нате... да.

-~{}~ 05.05.05 21:09:

..Да... Ещё чтобы я ман был по ентой библиотеке.. Да.. Да.. в chm .. с поиском и индексом... да... и с примерами... Да...
 
Сверху