Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

デスクトップCGIでWebとデスクトップを融合する 第5回

MySQLでAtomフィードをデータベース化 - 後編

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/03/01 00:00

ダウンロード ソースコード (11.0 KB)

「MySQLを使ったAtomフィードデータベース化」後編は、データベースに格納したフィードデータをCGIを使って取り出し、表示します。

目次

はじめに

 第5回は、第4回で作成したMySQLデータベース「atomfeeds」から、CGIでAtomフィードの要素を取り出し表示するCGIを作成します。

 また、第1回で作成した「feeds.cgi」をRSSフィードにも対応できるように改変し、さらにフィードの参照頻度に応じて表示順序を変更する仕組みに対応させます。

過去の記事

atom2msrdb_read.cgiでAtomデータベースから読み出す

 第4回では、MySQL上に作成した「atomfeeds」データベースにAtomフィードを格納しましたが、今度はそこからAtomフィードの要素を読み出し、HTMLに整形して出力します。

 DBIモジュールの新しいメソッドとしては、fetchrow_hashref()メソッドが重要です。prepareメソッドでSELECTコマンドを準備して、executeメソッドで実行したあと、fetchrow_hashref()メソッドは配列レファレンスを返します。ここで配列レファレンスを$rowとすると、カラムのインデックスがcol_iであれば、配列の要素に$row->{col_i}でアクセスできます。

 スクリプトは次のようになります。

atom2msrdb_read.cgi
#!/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/(<|&#60;)/</g;
    $str =~ s/(>|&#62;)/>/g;
    $str =~ s/('|&#39;)/'/g;
    $str =~ s/("|&#34;)/"/g;
    $str =~ s/(&|&#38;)/&/g;
    return $str;
}

 実行画面は以下のようになります。

atom2msrdb_read.cgiの実行画面
atom2msrdb_read.cgiの実行画面

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:PerlでデスクトップCGI

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5