サンプル:Perl DBIを利用する
DBIモジュールを利用する方法です。
use DBI;
プログラム例1では、DBIを用いた、画像ファイルの検索の例です。CGIスクリプトとして起動して、Webページ上にいくつかのビットマップファイルを表示させています。ここでは、DBI->connectでlocalhost:3306で、mysqlデータベースと接続して、予めテーブルの中に格納してあるファイル名をゲットしています。プログラム例では、
$dbh = DBI->connectで、データベースに接続
$sth = $dbh->prepareでクエリー文の発行
$sth->execute;でクエリーの実行(コミット)
$sth->rowsでレコード数
$sth->fetchrow_arrayでレコードをフィールドごとのデータを配列配列に格納
の順番に実行しています。本格的なデータアプリケーションでは、フォームなどにより、入力フィールドを設けて、検索をしたりします。
プログラム例
#!/usr/bin/perl
use DBI;
use Jcode;
#DBに設定されたID/PASS
$user = 'ユーザ名';$passwd = 'パスワード';
$db = DBI->connect('DBI:mysql:Image:localhost:3306', $user, $passwd);
print "Content-type: text/html; charset=EUC-JP\n\n";;
$display_num = 5;
$sth = $db->prepare(qq(SELECT filename FROM Fujisan limit $display_num));
$sth->execute;
$num_rows = $sth->rows;
@image_files;
for ($i=0; $i<$num_rows; $i++) {
@a = $sth->fetchrow_array;
push(@imagefiles , $a[0]);
}
$sth->finish; $db->disconnect;
print qq(
<HTML>
<HEAD>
<TITLE>画像の検索結果</TITLE>
</HEAD>
<BODY bgcolor="#FFFFFF">
<H2 align="center">画像データベースの検索結果</H2>
<!--画像の検索結果を2〜3件ためしに表示-->
<BR>
<hr>
<CENTER>
<table>
);
foreach my $filename (@imagefiles) {
print qq(
<tr><td>
<IMG SRC="./fujisan/$filename" width=200 height=140>
</td></tr>
) , "\n";
}
print qq(
</table>
</CENTER>
<DIV align="center">
<TABLE border="1">
);
print qq(
</TABLE>
</DIV>
);
データベースの内容の確認の実行結果
下記では、Imageというデータベース中のFlowerというテーブルの中身にビットマップファイル名があることを確認しています。
mysql> use Image;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_Image |
+-----------------+
| Flower |
| Fujisan |
| hakuba |
+-----------------+
3 rows in set (0.00 sec)
mysql> desc Flower;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| filename | varchar(16) | NO | | | |
+----------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> select * from Flower;
+----+-------------+
| id | filename |
+----+-------------+
| 1 | PHT_001.BMP |
| 2 | PHT_009.BMP |
| 3 | PHT_017.BMP |
| 4 | PHT_025.BMP |
| 5 | PHT_033.BMP |
| 6 | PHT_041.BMP |
| 7 | PHT_049.BMP |
| 8 | PHT_002.BMP |
| 9 | PHT_010.BMP |
| 10 | PHT_018.BMP |
| 11 | PHT_026.BMP |
| 12 | PHT_034.BMP |
| 13 | PHT_042.BMP |
| 14 | PHT_050.BMP |
| 15 | PHT_003.BMP |
| 16 | PHT_011.BMP |
| 17 | PHT_019.BMP |
| 18 | PHT_027.BMP |
| 19 | PHT_035.BMP |
| 20 | PHT_043.BMP |
| 21 | PHT_051.BMP |
| 22 | PHT_004.BMP |
| 23 | PHT_012.BMP |
| 24 | PHT_020.BMP |
| 25 | PHT_028.BMP |
| 26 | PHT_036.BMP |
| 27 | PHT_044.BMP |
| 28 | PHT_052.BMP |
| 29 | PHT_005.BMP |
| 30 | PHT_013.BMP |
| 31 | PHT_021.BMP |
| 32 | PHT_029.BMP |
| 33 | PHT_037.BMP |
| 34 | PHT_045.BMP |
| 35 | PHT_006.BMP |
| 36 | PHT_014.BMP |
| 37 | PHT_022.BMP |
| 38 | PHT_030.BMP |
| 39 | PHT_038.BMP |
| 40 | PHT_046.BMP |
| 41 | PHT_007.BMP |
| 42 | PHT_015.BMP |
| 43 | PHT_023.BMP |
| 44 | PHT_031.BMP |
| 45 | PHT_039.BMP |
| 46 | PHT_047.BMP |
| 47 | PHT_008.BMP |
| 48 | PHT_016.BMP |
| 49 | PHT_024.BMP |
| 50 | PHT_032.BMP |
| 51 | PHT_040.BMP |
| 52 | PHT_048.BMP |
+----+-------------+
52 rows in set (0.02 sec)
mysql>
プログラム 例
プログラムは、CGIスクリプトであり、ビットマップをHTMLファイルの中で表示するという例です。データベースでは、名前のみを格納していますが、実際のビットマップファイルは、CGI実行のディレクトリにあるという前提にします。コンソールで実行すると下記のような結果が出力されます。
[it-engineer@home1 perl]# perl 20070604.pl
Content-type: text/html; charset=EUC-JP
<HTML>
<HEAD>
<TITLE>画像の検索結果</TITLE>
</HEAD>
<BODY bgcolor="#FFFFFF">
<H2 align="center">画像データベースの検索結果</H2>
<!--画像の検索結果を2〜3件ためしに表示-->
<BR>
<hr>
<CENTER>
<table>
<tr><td>
<IMG SRC="./fujisan/PDRM0044.JPG" width=200 height=140>
</td></tr>
<tr><td>
<IMG SRC="./fujisan/PDRM0047.JPG" width=200 height=140>
</td></tr>
<tr><td>
<IMG SRC="./fujisan/PDRM0050.JPG" width=200 height=140>
</td></tr>
<tr><td>
<IMG SRC="./fujisan/PDRM0053.JPG" width=200 height=140>
</td></tr>
<tr><td>
<IMG SRC="./fujisan/PDRM0056.JPG" width=200 height=140>
</td></tr>
</table>
</CENTER>
<DIV align="center">
<TABLE border="1">
</TABLE>
</DIV>
[it-engineer@home1 perl]#

