2

私は自分のアルバムを表示するためにperlに基づいてcgiを作成しようとしていますが、現在は写真の並べ替え機能に取り組んでいます。各写真の情報をmysqlに保存しました。すべての写真を表示するには、最初に情報を取得する必要があります。

問題は次のとおりです。mysqlからフェッチされたデータは各写真のファイルサイズで並べ替えられると思いますが、fetchrow_array()の結果は、mysqlに挿入された時間に応じたデータの並べ替えになります。

mysqlシェルでテストしました

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;

間違ったコマンドを使用していますか?または、並べ替え機能を実行するために間違ったアプローチを使用していますか?助けてくれてありがとう!

4

1 に答える 1

3

ORDER BY式ではなく、フィールド名を取ります。

my $query = "SELECT * FROM album ORDER BY ".$dbh->quote_identifier($sort);
my $sth = $dbh->prepare($query);
$sth->execute();

ちなみに、出力側にもバグがあります。「 」、「」、または「 」$descriptionが含まれている場合はどうなりますか?逃げる必要があります。"&<

sub text_to_html {
   my ($s) = @_;
   $s =~ s/&/&amp;/g;
   $s =~ s/</&lt;/g;
   $s =~ s/>/&gt;/g;
   $s =~ s/"/&quot;/g;
   $s =~ s/'/&apos;/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;
于 2013-02-25T10:02:19.350 に答える