PerlのDBIでSELECTした結果をべた書きでHTML表にしたいならfetchrow_arrayallを使うと1行で全部配列に入るので楽ちん
スポンサードリンク
今まで、
my $dbh = $self->dbh;
my $sth = $dbh->prepare('SELECT * FROM customers');
my $res = $sth->execute();
my $data;
while (my $ref = $sth->fetchrow_hashref ) {
push @$data, $ref;
}
$dbh->commit;
undef $sth;
みたいなコードをひたすら書いていました(CGI::Applicationの中なのでちょっと書き方が変かも……)。SQLで出てきたやつを1行ごと取ってpush、無くなるまで繰り返し。これなんでやっているかっていうと、後段にHTML::Templateによるテンプレートエンジンが控えていて、このまま$dataをループに渡すってことをするんですよね。
でも、今日、whileがいらないってことに気付きました。なに使うかっていうと、fetchall_arrayrefを使う。一発で終わる。
my $dbh = $self->dbh;
my $sth = $dbh->prepare('SELECT * FROM customers');
my $res = $sth->execute();
my $data = $sth->fetchall_arrayref({});
$dbh->commit;
undef $sth;
後段のHTML::Templateでは、die_on_bad_params=>0を入れておくと、DBに入っていた余計なカラムのせいでエラーが出なくなるので良いです。テンプレート中の<tmpl_var name="...">には、カラムの名前をそのまま使えばよいっていう寸法です。
my $html = << 'END_OF_HTML';
<table class="list">
<tr>
<th>id</th>
<th>会社名</th>
</tr>
<tmpl_loop name="loop"
><tr>
<td><tmpl_var name="id"></td>
<td><tmpl_var name="company"></td>
</tr>
</tmpl_loop>
</table>
END_OF_HTML
my $t = $self->load_tmpl( \$html, die_on_bad_params => 0);
$t->param( loop => $data );
return $t->output;
ただ、時刻がDATETIME型(正確に言うと型ではないけど)で格納されていたりする場合、これだとGMTのままになってしまいますから、SQL側で現地時間にしましょう。
SQLiteのTIMESTAMP型のフィールド値をSQLiteのdatetime関数で日本時間に変換 - CLの日記 [d.hatena.ne.jp]
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3227





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする