CGI::Application::Plugin::DBHを使ってデータベースのテーブル内容を表示してみる
データベースに接続する
前回に引き続きCGI::Applicationの練習をいたします。 データベースにアクセスするための機能がPlug-inにありまして、これを使います。 cgiapp_init の中でDBに接続するコードを書きます。
use base 'CGI::Application'; use CGI::Application::Plugin::Session; use CGI::Application::Plugin::DBH (qw/dbh_config dbh/); sub cgiapp_init { my $self = shift; my $dbname = "db"; my $dsn = "DBI:Pg:dbname=$dbname"; my $dbUser = "user"; my $dbPass = "pass"; $self->dbh_config($dsn, $dbUser, $dbPass); }
HTML::Templateを使う
CGI::ApplicationはデフォルトでHTML::Templateを使えるようになっていまして、 これを使って表示させるとします。 setupの中でテンプレートファイルの所在を指定します。
sub setup { my $self = shift; $self->start_mode('listview_mode'); # 略 $self->tmpl_path('/some/path/to/template'); }
DBのテーブルを表示する
テーブルtblHogeの中身をlistview_modeというrun_modeで表示させるとします。
sub listview_mode { my $self = shift; my $template = $self->load_tmpl('listview.tmpl'); my $sql = 'SELECT hoge_id, hoge_time, hoge_title from tblHoge LIMIT 5'; my $sth = $self->dbh->prepare($sql); $sth->execute; my @rows; my ($hoge_id, $hoge_time, $hoge_title); $sth->bind_columns(\($hoge_id, $hoge_time, $hoge_title)); while ($sth->fetch) { push @rows, { HOGE_ID => $hoge_id, HOGE_TIME => $hoge_time, HOGE_TITLE => $hoge_title, }; } $template->param(LISTVIEW => \@rows); return $template->output; }
テンプレートファイルlistview.tmplは以下のような感じ。
<html> <head> <meta charset="utf-8"> <title>Hoge</title> </head> <body> <table> <TMPL_LOOP NAME="LISTVIEW"> <tr> <td><TMPL_VAR NAME="HOGE_ID"></td> <td><TMPL_VAR NAME="HOGE_TIME"></td> <td><TMPL_VAR NAME="HOGE_TITLE"></td> </tr> </TMPL_LOOP> </table> </body> </html>
昔は使えたかもしれない書き方
Web検索していると昔のブログ記事などで 「selectall_hashref(あるいはfetchrow_hashref)が返すリファレンスをそのままテンプレートに渡してOK!」 といったような記述に出会うことがありますが、少なくとも今はそんなことはできません。 DBIのメソッドの仕様が Ver.1.15 ~ 1.20の付近で変わった?とのこと。