如何使用Perl在与表头关联的超链接中使用querystring进行客户端排序?
大家好我希望大家都很好, 实际上,我有一个从sqlite数据库获取数据的表,我已经使用perl对网格进行了分页和过滤,现在我需要进行排序。 我想做的方法是将表标题设置为超链接,每当我单击它们时,它都应该按照我单击的列按升序或降序对表进行排序。 请让我知道这是可能的,如果是的话,请指导我找到解决方案。 这是我的密码。多谢各位如何使用Perl在与表头关联的超链接中使用querystring进行客户端排序?,perl,cgi,Perl,Cgi,大家好我希望大家都很好, 实际上,我有一个从sqlite数据库获取数据的表,我已经使用perl对网格进行了分页和过滤,现在我需要进行排序。 我想做的方法是将表标题设置为超链接,每当我单击它们时,它都应该按照我单击的列按升序或降序对表进行排序。 请让我知道这是可能的,如果是的话,请指导我找到解决方案。 这是我的密码。多谢各位 #!C:\perl\bin\perl.exe use CGI; use CGI::Carp qw(warningsToBrowser fatalsToBrowser); u
#!C:\perl\bin\perl.exe
use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use strict;
use warnings;
use DBI;
use POSIX;
my $query = new CGI;
my $q = new CGI;
my $numofPages;
my $i;
my @overduedata;
my $pageN;
my @rows = ();
my $pageNum=$query->param('pageNum');
my $Id="";
my $Name="";
my @list;
my $var;
my $val;
my $filterexpression= " ";
print "Content-Type: text/html\n\n";
$query = $ENV{'QUERY_STRING'};
@list = split( /\&/, $query);
foreach (@list) {
($var, $val) = split(/=/);
$val =~ s/\'//g;
$val =~ s/\+/ /g;
$val =~ s/%(\w\w)/sprintf("%c", hex($1))/ge;
($var, ' = ', $val,);
}
print <<END_HTML;
<html>
<head><title></title>
</head>
<body>
<form action="Filtering.cgi" method="post">
<TABLE>
<TR>
<TD>
<input type="hidden" name="submit" value="Submit">
</TD>
</TR>
</TABLE
</form>
</body></html>
END_HTML
my $dbh = DBI->connect("dbi:SQLite:DEVICE.db","", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
unless($pageNum) {
$pageNum=0;
}
my $offset;
unless($offset) {
$offset=11;
}
if ( $q->param("Filter") )
{
my $Id=$q->param('User_Id');
my $Name=$q->param('User_Name');
if ($Id ne "" )
{
$filterexpression= $filterexpression." UserId like '" .$Id. "%' and " ;
}
if ($Name ne "" )
{
$filterexpression= $filterexpression." UserName like '" .$Name. "%' and " ;
}
}
$filterexpression= $filterexpression. " UserId > 0" ;
my $exp;
my $query =$dbh->selectall_arrayref("SELECT * FROM UsersList " ." where ".
$filterexpression);
my $numOfRec=@$query ;
my $numofPages = ceil($numOfRec / $offset);
my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList " ."
where ". $filterexpression;
my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
$sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");
my $query=$dbh->selectall_arrayref('SELECT
UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList where '.
$filterexpression);
my $exp = @$query;
while (my ($UserId,$UserName,$CardNo,$GroupId,$Role,$VerifyType) = $sth-
>fetchrow_array())
{
push(@overduedata,{UserId=>$UserId,UserName=>$UserName,
CardNo=>$CardNo,GroupId=>$GroupId,Role=>$Role,VerifyType=>$VerifyType});
}
my $startDisplay = ($pageNum)*$offset;
my $endDisplay = ($pageNum + 1 ) * $offset;
$i = $startDisplay;
my $sql = "SELECT UserId,UserName,CardNo,GroupId,Role,VerifyType FROM UsersList" ;
my $sth = $dbh->prepare($sql) or die("\n\nPREPARE ERROR:\n\n$DBI::errstr");
$sth->execute or die("\n\nQUERY ERROR:\n\n$DBI::errstr");
print "<table class=\"tablestyle\">";
print "<tr border=1 style='background-color:#CDC9C9'>
<td class=\"tdstyle\" colspan=\"2\"></td>
<td><A HREF=\"http://localhost/cgi-bin/AddUser.cgi\">ADD</A></td>
<td><b>UserId</b></td>
<td><input type=\"text\" name=\"User_Id\" size=\"6\"></td>
<td><b>UserName</b></td>
<td><input type=\"text\" name=\"User_Name\" size=\"10\"></td>
<td><input type=\"submit\" name=\"Filter\" value=\"Filter\" ></td>
</tr>";
print "<tr class=\"trstyle1\"></tr>";
print "<tr class=\"trstyle2\">";
print "<th class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
Sortype=1\" class=\"hiddenlink\">$sth->{NAME}->[0]</A></th>";
print "<th colspan=\"2\" class=\"thstyle\">A HREF=\"http://localhost/cgi-
bin/Filtering.cgi?Sortype=2\" class=\"hiddenlink\">$sth->{NAME}->[1]</A></th>";
print "<th class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
Sortype=3\" class=\"hiddenlink\">$sth->{NAME}->[2]</A></th>";
print "<th class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
Sortype=4\" class=\"hiddenlink\">$sth->{NAME}->[3]</A></th>";
print "<th class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
Sortype=5\" class=\"hiddenlink\">$sth->{NAME}->[4]</A></th>";
print "<th class=\"thstyle\"><A HREF=\"http://localhost/cgi-bin/Filtering.cgi?
Sortype=6\" class=\"hiddenlink\">$sth->{NAME}->[5]</A></th>";
print "<th class=\"thstyle\"> EDIT</th>";
print "<th class=\"thstyle\"> DELETE</th>";
print "</tr>";
if($exp != 0)
{
while ($i < $endDisplay)
{
if($i == $exp){
last;}
print "<tr class=\"trstyle3\">
<td >" . $overduedata[$i]->{'UserId'} . "</td>
<td colspan=\"2\" >" . $overduedata[$i]->{'UserName'} . "</td>
<td>" . $overduedata[$i]->{'CardNo'} . "</td>
<td>" . $overduedata[$i]->{'GroupId'} . "</td>
<td>" . $overduedata[$i]->{'Role'} . "</td>
<td>" . $overduedata[$i]->{'VerifyType'} . "</td>
<td><A HREF=\"\">EDIT</A></td>
<td><A HREF=\"\">DELETE</A></td>
</tr>";
$i = $i + 1;
}
}
if ( $pageNum > 0 ) {
print q[<td><a href="Filtering.cgi?pageNum=0&Sortype=$val">|<</a></td>];
$pageN = $pageNum - 1;
print qq[<td><a href="Filtering.cgi?pageNum=$pageN&Sortype=$val"><</a></td>];
}
else
{
print q[<td><span class="currentpage">|<</span></td>];
print q[<td><span class="currentpage"><</span></td>];
}
if ( $pageNum < ( $numofPages - 1 ))
{
$pageN = $pageNum + 1;
print qq[<td><a href="Filtering.cgi?pageNum=$pageN&Sortype=$val">></a></td>];
$numofPages=$numofPages-1;
print qq[<td><a href="Filtering.cgi?
pageNum=$numofPages&Sortype=$val">>|</a></td>];
}
else {
print q[<td><span class="currentpage">></span></td>];
print q[<td><span class="currentpage">>|</span></td>];
}
print "</table>";
客户端表排序是通过Javascript实现的。这里有几十个图书馆。很容易实现。这不是对您问题的回答,而是一般性建议。因此,我把它变成了社区维基 请停止编写CGI脚本一段时间,直到您理解脚本出现严重问题的原因 你有:
use CGI;
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
# ...
my $query = new CGI;
my $q = new CGI;
print <<END_HTML;
<html>
<head><title></title>
</head>
<body>
<form action="Filtering.cgi" method="post">
<TABLE>
<TR>
<TD>
<input type="hidden" name="submit" value="Submit">
</TD>
</TR>
</TABLE
</form>
</body></html>
END_HTML
首先,请注意,您只需要初始化一次CGI对象。避免间接方法调用:
my $cgi = CGI->new;
我知道CGI.pm文档使用$query,但我发现$CGI更有意义
这是一个好的步骤。几乎所有CGI脚本都应该使用完善的库,而不是自制代码。但是,在迈出良好的第一步之后,您可以:
print "Content-Type: text/html\n\n";
$query = $ENV{'QUERY_STRING'};
@list = split( /\&/, $query);
foreach (@list) {
($var, $val) = split(/=/);
$val =~ s/\'//g;
$val =~ s/\+/ /g;
$val =~ s/%(\w\w)/sprintf("%c", hex($1))/ge;
($var, ' = ', $val,);
}
没有理由从事货运邪教活动。您的CGI对象已将参数传递给脚本
此外,您应该声明变量最初使用的位置,而不是在脚本中转储所有变量
使用CGI.pm的头发送头。你有:
print <<END_HTML;
<html>
<head><title></title>
</head>
<body>
<form action="Filtering.cgi" method="post">
<TABLE>
<TR>
<TD>
<input type="hidden" name="submit" value="Submit">
</TD>
</TR>
</TABLE
</form>
</body></html>
END_HTML
这毫无意义,因为在脚本中执行任何其他操作之前,您已经发送了完整的HTML文档
代码的其余部分无法更改您已发送的内容
将HTML放入模板中。就我个人而言,我喜欢代码和内容之间的清晰分离
通过这种方式,您可以编写Perl脚本来生成内容,并在模板中单独包含任何客户端功能。谢谢,但它不起作用。我下载了JScript,并将其放置在cgi bin中,以及提供此路径的标记中。然后,它只显示表数据。这是因为我正在放置打印内容类型:text/html\n\n;在html代码之前?请引导我。有两个原因说明这不起作用。⑴ 您将Javascript文件放入为服务器端CGI脚本保留的目录中。ApacheWebServer可以尝试将脚本作为CGI程序执行,而不只是将文件内容传输给请求该资源的浏览器。Javascript文件不是CGI程序,这将不起作用。⑵ C:\Pro…是一个本地路径。您不能在网页上使用该脚本,现代浏览器将拒绝加载此脚本,因为在Web上下文中本地文件是禁止的,而且除了您之外,它对任何其他人都不起作用[续…]。请注意,当其他用户的浏览器看到C:\Pro…路径时会发生什么-它指的是他的计算机上的一个位置必要的更改是将JS文件移动到另一个目录中,并使用Web服务器路径引用它,例如,如果您在htdocs Web服务器根目录中创建了一个名为static的子目录,那么您可以在src属性中使用path/static/sorttable.JS引用它。@sonya您的its my humble请求并不是那么小。在讨论按表头排序的问题之前,这个脚本有很多严重的问题。这是一个非常有用的信息,非常感谢您的知识。是的,总是分小步调试和探索。在stackoverflow上搜索sort html表会产生本周提出的相同问题:记住,总是将问题简化为一个简短的演示脚本,省去所有不必要的负担。隔离要处理的零件。