satoshiabe.jp : Introduction to DBI

HOME > DOCUMENTS > PROGRAMMING > Perl > Introduction to DBI

Introduction to DBI

Updated : 2006/05/09
Created : 2006/04/17

まえがき

構成

Apache HTTP Server をインストールする

MySQL をインストールする

Perl モジュールをインストールする

Perl スクリプトから MySQL へ接続する概要

リンク

まえがき

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)

Email to Satoshi ABE