我正在尝试创建一个基于perl的cgi来显示我的相册,现在我正在处理照片上的排序功能。我将每张照片的信息存储在mysql中。要显示所有照片,我必须先获取信息。
问题出在这里:我希望从mysql获取的数据按照每张照片的文件大小排序,但fetchrow_array()的结果是根据插入mysql的时间进行数据排序。
在mysql shell中,我测试了
SELECT * FROM album ORDER BY filesize;
,它给出了按文件大小排序的预期结果。这是我的源代码的一部分:
#!/usr/bin/perl -w
use strict;
use CGI;
my $sort = 'filesize';
# Connect the database
my $dbh = do 'db.pl';
# Prepare to print out the pictures
my $query;
$query = $dbh->prepare("SELECT * FROM album ORDER BY ?") or die $DBI::errstr;
$query->execute($sort) or die $DBI::errstr;
# Print out all pictures
while( my @data = $query->fetchrow_array() ){
# Process fetched data
(my $id, my $user, my $filepath, my $filename, my $filesize, my $uploadtime, my $description, my $tfilepath, my $sessioninfo) = @data;
print '<fieldset>';
# Display thumbnail
print '<a href="', $filepath, '"><img src="', $tfilepath, '" title="', $description, '"></a>';
# Display filename
print '</br>';
print $filename;
print '</fieldset>';
}
# Finish printing out all fetched pictures
$query->finish;
我使用了错误的命令吗?或者我使用错误的方法来执行排序功能? 谢谢你的帮助!
答案 0 :(得分:3)
ORDER BY
采用字段名称,而不是表达式。
my $query = "SELECT * FROM album ORDER BY ".$dbh->quote_identifier($sort);
my $sth = $dbh->prepare($query);
$sth->execute();
顺便说一下,你的输出端也有bug。如果$description
包含“"
”,“&
”或“<
”,该怎么办?你需要一些逃脱。
sub text_to_html {
my ($s) = @_;
$s =~ s/&/&/g;
$s =~ s/</</g;
$s =~ s/>/>/g;
$s =~ s/"/"/g;
$s =~ s/'/'/g;
return $s;
}
顺便说一下,
(my $id, my $user, my $filepath, my $filename,
my $filesize, my $uploadtime, my $description,
my $tfilepath, my $sessioninfo) = @data;
可以写成
my ($id, $user, $filepath, $filename,
$filesize, $uploadtime, $description,
$tfilepath, $sessioninfo) = @data;