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
コメントする