Хоть это и не в моих правилах... давать готовые решения, но уж ладно:
PERL:
#!/usr/bin/perl -w
use strict;
use CGI qw(:standard);
use lib \'.\';
use SQLayer;
use HTML::Template;
my $D = SQLayer -> new(database =>\'DBI:Pg:dbname=comma;host=localhost;port=5432\',user=>\'user\', password=>\'secret\');
my $limit=10; #кол-во выводимых сток.
my $order_from=param(\'order_from\'); # переменная с которой начинаеться выборка.
my @all_rows=$D->column("SELECT ..."); #выбираем общее кол-во строк.
my $PData=$D->row_hash("SELECT .... LIMIT $limit OFFSET $order_from"); #выбираемограниченное кол-во строк.
my $num_col=scalar(@all_rows);
my $navigate;
my $var_num=0;
my ($order_from_next, $order_from_last, $check_last, $check_next, $limit_nl);
my $i=0;
while ($num_col >= $var_num)
{
$navigate->[$i]{\'order_from\'}=$var_num;
$navigate->[$i]{\'limit\'}=$limit;
$navigate->[$i]{\'number\'}=$i+1;
if ($var_num==$order_from)
{$navigate->[$i]{\'select\'}=1;}
else {$navigate->[$i]{\'select\'}=0;}
$var_num+=$limit;
$i++
}
my $NA=0;
while ($navigate->[$NA])
{
if ($navigate->[$NA]{\'order_from\'}==$order_from)
{
unless ($NA==0)
{
$order_from_last=$navigate->[$NA-1]{\'order_from\'};
$check_last=1;
}
else
{
$check_last=0;
}
unless ($NA==$i-1)
{
$order_from_next=$navigate->[$NA+1]{\'order_from\'};
$check_next=1;
}
else
{
$check_next=0;
}
$limit_nl=$navigate->[$NA]{\'limit\'};
}
$NA++
}
my $check_select=0;
my $T = HTML::Template -> new(filename => "test.tmpl");
print "Content-type: text/html\\n\\n";
$T -> param(abc=>$PData, navigate=>$navigate, order_from_next=>$order_from_next, order_from_last=>$order_from_last, limit_nl=>$limit_nl, check_last=>$check_last, check_next=>$check_next, check_select=>$check_select);
print $T -> output();