如何在Perl CGI脚本中进行分页?

如何在Perl CGI脚本中进行分页?,perl,cgi,Perl,Cgi,我有一个CGI页面,其中包含一个表,该表通过从数据库获取数据来填充,换句话说,它就像一个DATAGRID 在网格的右下角,我需要一个像“First>Last”这样的链接 或者像点击“|>|”一样,我可以在记录中来回导航。我打算每页有“10”条记录 在网上冲浪时,我得到了一段代码,我将把它粘贴到“代码”字段中。但问题是它显示的分页链接类似于“12345..等等”。但是我不愿意使用这种分页格式,因为记录的数量会增加,链接的长度也会不断增加。那么,这段代码可以修改成我想要的格式吗 #!C:\perl\

我有一个CGI页面,其中包含一个表,该表通过从数据库获取数据来填充,换句话说,它就像一个DATAGRID

在网格的右下角,我需要一个像“First>Last”这样的链接 或者像点击“|<>>|”一样,我可以在记录中来回导航。我打算每页有“10”条记录

在网上冲浪时,我得到了一段代码,我将把它粘贴到“代码”字段中。但问题是它显示的分页链接类似于“12345..等等”。但是我不愿意使用这种分页格式,因为记录的数量会增加,链接的长度也会不断增加。那么,这段代码可以修改成我想要的格式吗

#!C:\perl\bin\perl.exe -wT

use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use strict;
use warnings;
use DBI;
my $query = new CGI;
my $bornum;
my $itemnum;
my $i;
my @overduedata;
my $pageNum =$query->param('pageNum');
print "Content-Type: text/html\n\n";

unless($pageNum) {
   $pageNum=0;
 }
my $offset=$query->param('offset');
unless($offset) {
    $offset=10;
 }
$i=0;
my $numOfRec = 100;
while ($i < $numOfRec){
   $bornum = "bornum" . $i;
   $itemnum = "itmnum" . $i;
   push (@overduedata, { bornum => $bornum, itemnum => $itemnum });
   $i = $i + 1;
 }

print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">";
print "\n<form>";
print "\nNo: of records per page : <input type=text name=offset>";
print "\n<input type=submit value=submit>";
print "\n</form>";
print "\n<br> No: of rec per page = " . $offset . " -- pageNum = " . $pageNum ;
print "<table border=1>";

my $startDisplay = ($pageNum) * $offset;
my $endDisplay = ($pageNum + 1) * $offset;
$i = $startDisplay;
while ($i < $endDisplay){
   print "<tr><td>" . $i . "</td><td>" . $overduedata[$i]->{'bornum'} . "</td><td>" .
          $overduedata[$i]->{'itemnum'} . "</td></tr>";
   $i = $i + 1;
 }
print "</table>";

my $numofPages = $numOfRec / $offset;
$i = 0;
print "<table border=1><tr>";
while ($i < $numofPages){
     print "<td> <a href = ?pageNum=" . $i . "&offset=" . $offset . ">" . 
             $i . "</a></td>";
     $i = $i + 1;
}
print "<tr></table>";


---------------------------------------------------------------------------------------
#!C:\perl\bin\perl.exe-wT
使用CGI;
使用CGI::Carp qw(警告浏览者fatalsToBrowser);
严格使用;
使用警告;
使用DBI;
my$query=新CGI;
我的$bornum;
我的$itemnum;
我的$i;
我的@overduedata;
我的$pageNum=$query->param('pageNum');
打印“内容类型:text/html\n\n”;
除非($pageNum){
$pageNum=0;
}
我的$offset=$query->param('offset');
除非($抵消){
$offset=10;
}
$i=0;
我的$numOfRec=100;
而($i<$numOfRec){
$bornum=“bornum”。$i;
$itemnum=“itmnum”。$i;
push(@overduedata,{bornum=>$bornum,itemnum=>$itemnum});
$i=$i+1;
}
打印“”;
打印“\n”;
打印“\n否:每页记录数:”;
打印“\n”;
打印“\n”;
打印“\n
每页记录的编号=”$抵消。“--pageNum=”$pageNum; 打印“”; my$startDisplay=($pageNum)*$offset; my$endDisplay=($pageNum+1)*$offset; $i=$startDisplay; 而($i<$endDisplay){ 打印“$i.”“$overduedata[$i]->{'bornum'}.”。 $overduedata[$i]->{'itemnum'}。”; $i=$i+1; } 打印“”; 我的$numofPages=$numOfRec/$offset; $i=0; 打印“”; 而($i<$numofPages){ 打印“”; $i=$i+1; } 打印“”; ---------------------------------------------------------------------------------------
我想你可能想要。

我想你可能想要。

如果你不喜欢的只是链接,那么你可以修改最后的循环来打印你想要的链接。这只是操纵页码的问题

(我不知道你是从哪里得到这段代码的,但是“0页”对那些几十年来一直使用0偏移量的程序员来说都不是用户友好的!如果你知道你的页面大小,那么偏移量是不必要的数据,因为它表示页面大小更大,这也是错误的。)

因此,最简单的变化是:

my $pageN;
if ( $pageNum > 0 ) { 
    print q[<td><a href="?pageNum=1">|&lt;</a></td>];
    $pageN  = $pageNum - 1;
    print qq[<td><a href="?pageNum=$pageN">&lt;</a></td>];
}
else  { # don't link to the current page
    print q[<td><span class="currentpage">|&lt;</span></td>];
    print q[<td><span class="currentpage">&lt;</span></td>];

}

if ( $pageNum < ( $numofPages - 1 )) { 
    $pageN  = $pageNum + 1;
    print qq[<td><a href="?pageNum=$pageN">&gt;</a></td>];
    print qq[<td><a href="?pageNum=$numofPages">&gt;|</a></td>];
}
else { # don't link to the current page
    print q[<td><span class="currentpage">&gt;</span></td>];
    print q[<td><span class="currentpage">&gt;|</span></td>];
}

如果您不喜欢的只是链接,那么您可以修改末尾的循环以打印所需的链接。这只是操纵页码的问题

(我不知道你是从哪里得到这段代码的,但是“0页”对那些几十年来一直使用0偏移量的程序员来说都不是用户友好的!如果你知道你的页面大小,那么偏移量是不必要的数据,因为它表示页面大小更大,这也是错误的。)

因此,最简单的变化是:

my $pageN;
if ( $pageNum > 0 ) { 
    print q[<td><a href="?pageNum=1">|&lt;</a></td>];
    $pageN  = $pageNum - 1;
    print qq[<td><a href="?pageNum=$pageN">&lt;</a></td>];
}
else  { # don't link to the current page
    print q[<td><span class="currentpage">|&lt;</span></td>];
    print q[<td><span class="currentpage">&lt;</span></td>];

}

if ( $pageNum < ( $numofPages - 1 )) { 
    $pageN  = $pageNum + 1;
    print qq[<td><a href="?pageNum=$pageN">&gt;</a></td>];
    print qq[<td><a href="?pageNum=$numofPages">&gt;|</a></td>];
}
else { # don't link to the current page
    print q[<td><span class="currentpage">&gt;</span></td>];
    print q[<td><span class="currentpage">&gt;|</span></td>];
}

首先,我想感谢您的即时回复。先生,我通过您指定的链接下载了D驱动器中可用的tar文件。但我不知道应该将哪些代码和代码放在哪里。因此,我现在也将代码粘贴到了代码字段中。因此,请指导我进一步做什么。谢谢,先生。您需要安装它。Perl对此有一个系统。在shell中键入'cpan Data::Pageset',并且(如果shell可以找到cpan命令),不仅会下载代码,还会安装代码及其依赖项。最近所有的“sir”和“boss”是怎么回事?shell?实际上我不喜欢UNIX或LINUX。我在WINDOWS(XP)平台上工作。此数据::页面集在windows上无法工作?请务必让我知道。您是想告诉我windows没有外壳吗?那是胡说八道。我使用Windows进行开发已有多年了,但它以前被称为command.com。我认为您正在使用ActivePerl。它有自己的安装CPAN模块的机制。尝试阅读文档。首先,我想感谢您的即时回复。先生,我通过您指定的链接下载了D驱动器中可用的tar文件。但我不知道应该将哪些代码和代码放在哪里。因此,我现在也将代码粘贴到了代码字段中。因此,请指导我进一步做什么。谢谢,先生。您需要安装它。Perl对此有一个系统。在shell中键入'cpan Data::Pageset',并且(如果shell可以找到cpan命令),不仅会下载代码,还会安装代码及其依赖项。最近所有的“sir”和“boss”是怎么回事?shell?实际上我不喜欢UNIX或LINUX。我在WINDOWS(XP)平台上工作。此数据::页面集在windows上无法工作?请务必让我知道。您是想告诉我windows没有外壳吗?那是胡说八道。我使用Windows进行开发已有多年了,但它以前被称为command.com。我认为您正在使用ActivePerl。它有自己的安装CPAN模块的机制。尝试阅读文档。一般建议:CGI具有生成HTML的功能。使用它们。它们将帮助您生成实际的HTML,并使您的代码更具可读性。可能重复我们昨天刚刚回答的问题:一般建议:CGI具有生成HTML的功能。使用它们。它们将帮助您生成实际的HTML,并使您的代码更具可读性。可能重复我们昨天刚刚回答的问题:非常感谢您的帮助axeman先生,我将检查代码并在完成后与您联系,如果我在实现它时遇到ant问题。谢谢。您好,我尝试使用上面的代码bt,但我遇到了一个错误,即在线路上。。“?$query->a({href=>“?pageNum=$page”},$text)[错误是:无法在未禁用的引用行98上调用方法“a”。]。这个无版权的引用是什么?我如何删除它?请sombody帮我整理一下好吗?谢谢。@sonya:密码
use List::Util qw<max min>;
my $min_page = max( 1, $pageNum - 5 );
my $max_page = min( $numofPages, $min_page + 10 );
$min_page    = max( 1, min( $min_page, $max_page - 10 ));
  ( [ 1                 => '|&lt;' ]
  , [ ( $pageNum - 1 )  => '&lt;'  ]
  , ( map { [ $_ => $_ ] } $min_page..$max_page )
  , [ ( $pageNum + 1 )  => '&gt;'  ]
  , [ $numofPages       => '&gt;|' ]
  )