Как разбивать запрос на страницы (постраничный вывод данных)?

Что такое разбивка на страницы? Самый простой пример — поисковые машины. Вы даете команду на поиск в ответ на что сервер выдает тысячи ссылок (и прочая информация типа названия страницы, даты, и пр.). Но находится данная информация не на одной странице. Она разбита на части. В этом примере вы научитеть разбивать результат поиска по базе данных на куски, чтобы организировать постарничный вывод.

Создадим файл default.phtml, который содержит базовые фукнции. Вам надо подправить параметры (host/user/pass/base)

<? 

// Глобальная переменная. Например, нужна в функции коннекта. 
$sock=false; 


// новые функции 
function sql($a) { return mysql_query($a); } 
function sqlrows($a) { return @mysql_num_rows($a); } 
function sqlval($a,$b,$c) { return @mysql_result(mysql_query($a),$b,$c); } 
function sqlget($a) { return @mysql_fetch_array($a); } 
function sqlline($a) { return sqlget(sql($a)); } 
function sqllast() { return mysql_insert_id(); } 


// коннект к серверу 
function connect() { 
global $sock; 

$host="*****"; 
$user="*****"; 
$base="*****"; 
$pass="*****"; 

$sock=@mysql_connect($host,$user,$pass); 
if ( ! $sock || ! @mysql_select_db($base,$sock)) 
die("Сервер временно не работает"); 

unset($host); 
unset($user); 
unset($base); 
unset($pass); 

} 

// замена die() 
function xdie($zapros="", $info="") { 
die("</table></table></table></table><hr><h3>************ $info ***********<br><br> 
sql error..... n".mysql_errno().": ".mysql_error()."</h3><pre>$zapros</pre><hr>"); 
} 


?>

данный файл (create.phtml) создаст таблицу limit_test и забьет в нее 500 строк
вида из разных строк.

<? 

include("./default.phtml"); 

connect(); 

// удаляем таблицу (на всякий случай) 
sql("drop table limit_test"); 
// создаем 
if (!sql("create table limit_test (id int, s char(100))")) 
xdie("","Таблица не создана"); 

srand(time()); 

// создаем запрос вида << ... values (x,"xx"), (y,"yy"), ... (z,"zz") >> 
$s="insert into limit_test values "; 

for ($i=0; $i<500; $i++) { 

$s.="($i,""; 
$x=rand(1,100); 
for ($j=0; $j<$x; $j++) $s.=chr(rand(ord('a'),ord('z'))); 
$s.="")"; 
if ($i+1<500) $s.=","; 

} 

// выполняем запрос, чтобы наполнить таблицу данными 
if (!sql($s)) xdie($s,"Таблица не заполнена"); 

?>

Собственно, сам файл (search.phtml), который выводит на экран форму для поиска и
выводит найденные результаты по ?? штук на страницу.

<body bgcolor=black text=white link=#9999cc vlink=#cc9999><font face=arial> 
<? 

include("./default.phtml"); 

if (!isset($z)) $z=""; 
if (isset($all)) $all=intval($all); 
if (isset($start)) $start=intval($start); 
if (isset($len)) $len=intval($len); 
else $len=10; 

echo "<form action="http://phpclub.chat.ru/mysql/%24php_self" method=get> 
<input type=hidden name=z value=search> 
Что ищем: 
<input type=text name=s value='$s'> 
Строк: 
<input type=text name=len value='$len' size=5> 
&nbsp; <input type=submit value=' search '><br><br> 
Спец. символы: 
<font color=#ff6666><b><big>_</big></b></font> - заменяет 1 любую букву, 
<font color=#ff6666><b><big>%</big></b></font> - заменяет любую последовательность букв. 
Поиск '<b>%</b>' - найдет все строки, поиск '<b>_</b>' - только строки, 
состоящие из 1 символа. Если поискать 'a', то, скорее всего, ничего 
не будет найдено, однако строки '%a%' точно найдутся.<br> 
</form>"; 

switch ($z) { 

case "search": 

connect(); 

$query="select s from limit_test where s like '$s'"; 

if (!isset($start)) { 

if (!( $res=sql($query) )) xdie($query,"ошибка"); 
$start=0; 
$all=sqlrows($res); 

} else { 

$query.=" limit $start,$len"; 
if (!( $res=sql($query) )) xdie($query,"ошибка"); 

} 

echo "Запрос: <font color=#00ff00>$query</font><br><br>"; 

for ($j=1; $j<=$len && $tmp=sqlget($res); $j++) { 
echo ($start+$j).". $tmp[s]<br>"; 
$stop--; 
} 

echo "<br>"; 
for ($i=1; $i<=floor($all/$len); $i++) 
echo "<a href="../../tppmsgs/msgs0.htm#123" tppabs="http://phpclub.chat.ru/mysql/%24php_self?z=search&all=$all&len=$len&"." 
"start=".(($i-1)*$len)."&s=".urlencode($s).">$i</a> "; 

break; 
} 


?>