はじめに
第5回は、第4回で作成したMySQLデータベース「atomfeeds」から、CGIでAtomフィードの要素を取り出し表示するCGIを作成します。
また、第1回で作成した「feeds.cgi」をRSSフィードにも対応できるように改変し、さらにフィードの参照頻度に応じて表示順序を変更する仕組みに対応させます。
過去の記事
- 第1回 Firefox/Apache用AtomリーダーCGIの作成
- 第2回 Web日記のAtom配信
- 第3回 独自の日記記述言語からHTML形式のWeb日記を出力・配信する
- 第4回 MySQLでAtomフィードをデータベース化 - 前編
atom2msrdb_read.cgiでAtomデータベースから読み出す
第4回では、MySQL上に作成した「atomfeeds」データベースにAtomフィードを格納しましたが、今度はそこからAtomフィードの要素を読み出し、HTMLに整形して出力します。
DBIモジュールの新しいメソッドとしては、fetchrow_hashref()
メソッドが重要です。prepare
メソッドでSELECT
コマンドを準備して、execute
メソッドで実行したあと、fetchrow_hashref()
メソッドは配列レファレンスを返します。ここで配列レファレンスを$row
とすると、カラムのインデックスがcol_i
であれば、配列の要素に$row->{col_i}
でアクセスできます。
スクリプトは次のようになります。
#!/Perl5.8/bin/perl.exe use strict; use warnings; use DBI; use CGI qw(:cgi); my $atomurl = ""; # Atom URL データの取得 if(param('atom')){ # CGI で URL を取得する $atomurl = param('atom'); }elsif($ARGV[0]){ # コマンドラインから URL を取得する $atomurl = $ARGV[0]; }else{ $atomurl = "http://homepage1.nifty.com/kazuf/renewal_atom.xml"; # print "Atom URL データが存在しない。\n";exit;# 終了する } # CGI 最初の部分の出力 print <<HEADER; Content-type: text/html; charset=UTF-8 <html> <head> <title>ATOM DB Reader</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="/mystyle.css" /> <script type="text/javascript"> <!-- if(navigator.appCodeName.indexOf("Mozilla") != -1){ document.write( "<link rel='stylesheet' type='text/css' href='/firefox.css' />"); } --> </script> </head> <body> <h3>Atom DB Reader</h3> HEADER ##### my $dbh = DBI->connect( "DBI:mysql:database=atomfeeds;host=localhost;port=3306", "root", "password", {'RaiseError' => 1}); my $sth = $dbh->prepare(qq{ SELECT atom,link,ver,title,tagline, modified,info,logo,icon,subtitle,updated FROM feeds WHERE atom = \"$atomurl\" }); $sth->execute(); while(my $row = $sth->fetchrow_hashref()){ print "<a href=\"$row->{link}\">$row->{title}</a>\n"; if($row->{logo}){ print "<p><img src=\"$row->{logo}\">$row->{subtitle}</p>\n"; }elsif($row->{icon}){ print "<p><img src=\"$row->{icon}\">$row->{subtitle}</p>\n"; }else{ print "<p>$row->{subtitle}</p>\n"; } print "<p>$row->{updated}</p>\n<hr>\n"; } $sth = $dbh->prepare(qq{ SELECT atom, issued, published, link, title, content, name, modified, created, id, updated, summary, category FROM entries WHERE atom = \"$atomurl\" }); $sth->execute(); while(my $row = $sth->fetchrow_hashref()){ if($row->{category}){ print "[$row->{category}]<a href=\"$row->{link}\">$row->{ti tle}</a>\n"; }else{ print "<a href=\"$row->{link}\">$row->{title}</a>\n"; } print "<p>$row->{updated}</p>\n<hr>\n"; my $content = &entities_decode($row->{content}); print "$content\n<hr>\n"; } $sth->finish(); $dbh->disconnect(); ##### print "</body></html>\n"; exit(0); # マークアップ記号の実体参照デコード # 文字実体参照と数値実体参照の両方に対応 sub entities_decode{ my($str) = @_; $str =~ s/(<|<)/</g; $str =~ s/(>|>)/>/g; $str =~ s/('|')/'/g; $str =~ s/("|")/"/g; $str =~ s/(&|&)/&/g; return $str; }
実行画面は以下のようになります。