satoshiabe.jp : Introduction to DBI
HOME > DOCUMENTS > PROGRAMMING > Perl > Introduction to DBI
まえがき
Perl の DBI モジュールを使用し、Perl スクリプトからベータベース MySQL に接続し、SQL 処理した結果を HTML ページとして表示する CGI を作成たときのメモ。
構成
今回は、同一マシンに Apache HTTP Server と MySQL をインストールする。
Apache HTTP Server をインストールする
ここを参考にする。
CGI を有効にする
httpd.conf に追記する。 CGI スクリプトを保存するディレクトリ /usr/local/apache2/cgi-bin/ と www.example.com/cgi-bin/ をマッピングする。
mod_alias - Apache HTTP サーバ (apache.org)
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
MySQL をインストールする
ここを参考にする。
サンプルデータベース
サンプルのデータベースとして、以下のデータベース db01 を作成する。
% /usr/local/bin/mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 5.1.7-beta Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> mysql> CREATE DATABASE db01; Query OK, 1 row affected (0.00 sec) mysql> mysql> SHOW DATABASES; +---------------------+ | Database | +---------------------+ | db01 | +---------------------+ 1 rows in set (0.00 sec) mysql>
テーブル data を作成する。
mysql> USE db01; Database changed mysql> mysql> CREATE TABLE data ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(20) NOT NULL, last_name VARCHAR(20) NOT NULL, email VARCHAR(20) ); Query OK, 0 rows affected (0.00 sec) mysql> mysql> SHOW FIELDS FROM data; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | NO | | | | | last_name | varchar(20) | NO | | | | | email | varchar(20) | YES | | NULL | | +------------+------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql>
サンプルレコードを登録する。
mysql> SELECT * FROM data; Empty set (0.00 sec) mysql> mysql> INSERT INTO data VALUES (1, "Satoshi", "Abe", "root@satoshiabe.jp"); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT * FROM data; +----+------------+-----------+--------------------+ | id | first_name | last_name | email | +----+------------+-----------+--------------------+ | 1 | Satoshi | Abe | root@satoshiabe.jp | +----+------------+-----------+--------------------+ 1 row in set (0.00 sec) mysql> mysql> INSERT INTO data VALUES (2, "Hogeyama", "Fugao", "hogefuga@example.com"); Query OK, 1 row affected (0.01 sec) mysql> mysql> SELECT * FROM data; +----+------------+-----------+----------------------+ | id | first_name | last_name | email | +----+------------+-----------+----------------------+ | 1 | Satoshi | Abe | root@satoshiabe.jp | | 2 | Hogeyama | Fugao | hogefuga@example.com | +----+------------+-----------+----------------------+ 2 rows in set (0.00 sec) mysql>
Perl モジュールをインストールする
DBI
DBI - Database independent interface for Perl - search.cpan.org から最新の DBI をダウンロードして、インストールする。
% ls DBI-1.50.tar.gz % tar xzvf DBI-1.50.tar.gz % cd DBI-1.50 % perl Makefile.PL % make % make test % su # make install
DBI は、DBI プログラミングのインタフェースが定義されており、適切なドライバ(後述)をロードするためのメソッドが定められている。 Perl スクリプトは、この DBI にメソッドを渡すと、DBI が適切なドライバを呼んで実行した結果を返してくれる。 Perl スクリプトからデータベースの種類を意識しなくて良い。
DBD::mysql
DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI) - search.cpan.org から最新の DBD::mysql をダウンロードして、インストールする。
% ls DBD-mysql-3.0002.tar.gz % tar DBD-mysql-3.0002.tar.gz % cd DBD-mysql-3.0002 % perl Makefile.PL % make % make test % su # make install
DBD::mysql は、データベースドライバだ。
Perl スクリプトから MySQL へ接続する
Perl スクリプトから MySQL へ接続する。 尚、このスクリプトは、エラー処理をほとんど考慮していない。
フロントページを作成する
フロントページからのファイルを作成する。
# vi /usr/local/apache2/htdocs/index.html
HTML ファイルの内容。 テキストボックスにテーブル名を入力して、SELECT COLUMNS または SELECT * をラジをボタンで選択する画面を表示する。 この html ファイルを、たとえば Apache HTTP Server の htdocs ディレクトリに保存する。 action で指定されているファイルは、この html ファイルでキックされる cgi スクリプトだ。 そのため、この次で例を挙げる Perl の CGI スクリプトは、cgi-bin ディレクトリに test01.cgi として保存されていることを期待している。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>test01.html</title> </head> <body> <form action="../cgi-bin/test01.cgi" method="post"> <p><input type="radio" name="sql" value="SHOW" checked="checked"> SHOW COLUMNS FROM <input type="text" name="dbname" value="" /></p> <p><input type="radio" name="sql" value="SELECT"> SELECT * FROM <input type="text" name="dbname" value="" /></p> <p><input type="submit" value="send" /></p> <p><input type="reset" value="reset" /></p> </form> </body> </html>
vi を終了する。
:wq
Perl スクリプトを作成する
先ほど作成した HTML ファイルから POST されてきたデータを受け取り、SQL を実行して HTML ファイルを表示する Perl スクリプトを作成する。
# vi /usr/local/apache2/cgi-bin/test01.cgi
Perl スクリプトの内容。
#!/usr/bin/perl -wT use strict; use CGI; # DBI クラスをロードする。 use DBI; # CGI クラスのオブジェクトを作成し参照変数 $q に代入する。 my $q = new CGI; # データベース db01 を指定する。 # MySQL へ接続するために使用するユーザ名 user と パスワード pass を指定する。 my $dbh = DBI->connect('DBI:mysql:db01', 'user', 'pass') or die 'Cannot connect to MySQL Database.' . $DBI::errstr; # POST されたパラメータを取得する。 my $dbname = $q->param("dbname"); my $search = $q->param("sql"); my $sql; if ($search eq "SHOW") { $sql = "$search COLUMNS FROM $dbname"; } elsif ($search eq "SELECT") { $sql = "$search * FROM $dbname"; } my $sth = $dbh->prepare($sql) or die 'Cannot prepare: ' . $dbh->errstr(); $sth->execute() or die 'Cannot execute: ' . $sth->errstr(); print $q->header(-type => "text/html", -charset=>'UTF-8'), $q->start_html( -title=>"welcome", -encoding=>"UTF-8", -lang=>'ja', ); while (my @row = $sth->fetchrow_array()) { print $q->p("@row"); } print $q->end_html; # データベースから切断する。 $dbh->disconnect();
vi を終了する。
:wq
実行権限を付与しておく。
# chmod 0755 test01.cgi
確認してみる
先ほど作成したフロントページの HMLT ファイルを表示して、SQL 文を実行した結果を確認する。
リンク
perl.com: A Short Guide to DBI (perl.com)
perl.com: Database Programming with Perl (perl.com)