M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2010年5月20日 17:47

PerlのDBIでSELECTした結果をべた書きでHTML表にしたいならfetchrow_arrayallを使うと1行で全部配列に入るので楽ちん

このエントリーをはてなブックマークに追加 mixiチェック

今まで、

  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]

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3227

コメントする