サンプルは、主な使用方法のみです。トランザクションなどは考慮していません。
また、DBI等の使用法やPerlなどの言語仕様等は一切お答えいたしませんので、専門の紹介サイトで確認して下さい。
『データベースサーバの構築(MySQL)』時に、「perl-DBI」と「perl-DBD-MySQL」が自動的にインストールされていると思います。
インストールされていない場合は「yum」で個別に「perl-DBI」と「perl-DBD-MySQL」をインストールしてください。
「perl-DBI」および「perl-DBD-MySQL」がインストールされているか確認 # rpm -qa perl-DBI perl-DBD-MySQL コマンド実行結果に何も表示されなければ、パッケージをインストールしてください または、何れかの結果が表示されない方をインストールして下さい。 パッケージ「perl-DBI」と「perl-DBD-MySQL」のインストール # yum -y install perl-DBI perl-DBD-MySQL モジュールを有効にする為、apacheを再起動 【FC1 から Fedora15 / CentOS4 / CentOS5 / CentOS6 の場合】 # /etc/rc.d/init.d/httpd restart 【Fedora16以降 の場合】 # systemctl restart httpd.service |
#!/usr/bin/perl 下記の1行を追加 use DBI; |
データベース接続の構文
$dbh = DBI -> connect ("DBI:mysql:$dbname:localhost",$dbusername,$dbpassword)
$dbname:データベース名
$dbusername:接続ユーザ名(Linuxアカウントでない事に注意)
$dbpassword:接続ユーザのパスワード
$dbh:正常接続した時のデータベースハンドル
|
実行コマンドの構文 $sth = $dbh->prepare($sql); $sth -> execute() $sql:SQL文 $sth:実行コマンドのハンドル |
データベース切断の構文 $dbh -> disconnect(); $dbh:データベース接続時のデータベースハンドル |
サンプルスクリプトプログラムの作成
# vi /var/www/html/cgi-bin/OperatedMySQL.cgi
#!/usr/bin/perl
use DBI;
#------------------------------#
# 設定項目 #
#------------------------------#
$dbname = "meibo"; # データベース名
$dbusername = "linux"; # データベース接続ユーザー名
$dbpassword = "himitsu"; # 接続ユーザパスワード
$tbname = "user"; # テーブル名
$script = "OperatedMySQL.cgi"; # スクリプト名
#------------------------------#
# メイン処理 #
#------------------------------#
&decode; # デコード処理
if ($mode eq "view") { &view; }
elsif ($mode eq "disp_insert") { &disp_insert; }
elsif ($mode eq "disp_delete") { &disp_delete; }
elsif ($mode eq "disp_update") { &disp_update; }
elsif ($mode eq "execute") { &execute; }
&view; # 表示処理
exit 0;
#------------------------------#
# 表示処理 #
#------------------------------#
sub view {
&task_before; # 前処理
print <<"EOM";
<TABLE border="1" cellspacing="1">
<TBODY>
<TR bgcolor="#0080ff">
<TH>Num</TH>
<TH>Name</TH>
</TR>
EOM
while(@data = $sth -> fetchrow_array){
$num = $data[0];
$name = $data[1];
print " <TR>\n";
print " <TD>$num</TD>\n";
print " <TD>$name</TD>\n";
print " </TR>\n";
}
print <<"EOM";
</TBODY>
</TABLE>
EOM
&task_after; # 後処理
exit ;
}
#------------------------------#
# 追加モード表示 #
#------------------------------#
sub disp_insert {
&task_before; # 前処理
print <<"EOM";
<FORM action="$script">
<INPUT type="hidden" name="mode" value="execute">
<INPUT type="hidden" name="process" value="insert">
<TABLE border="1" cellspacing="1">
<TBODY>
<TR bgcolor="#0080ff">
<TH>Num</TH>
<TH>Name</TH>
</TR>
EOM
while(@data = $sth -> fetchrow_array){
$num = $data[0];
$name = $data[1];
print " <TR>\n";
print " <TD>$num</TD>\n";
print " <TD>$name</TD>\n";
print " </TR>\n";
}
print <<"EOM";
<TR>
<TD>Add Value</TD>
<TD><INPUT size="32" type="text" maxlength="32" name="tb_addname"></TD>
</TR>
<TR>
<TD colspan="2" align="center"><INPUT type="submit" name="btn_submit" value="追加"></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
EOM
&task_after; # 後処理
exit ;
}
#------------------------------#
# 削除モード表示 #
#------------------------------#
sub disp_delete {
&task_before; # 前処理
print <<"EOM";
<FORM action="$script">
<INPUT type="hidden" name="mode" value="execute">
<INPUT type="hidden" name="process" value="delete">
<TABLE border="1" cellspacing="1">
<TBODY>
<TR bgcolor="#0080ff">
<TH>Num</TH>
<TH>Name</TH>
<TH>select</TH>
</TR>
EOM
while(@data = $sth -> fetchrow_array){
$num = $data[0];
$name = $data[1];
print " <TR>\n";
print " <TD>$num</TD>\n";
print " <TD>$name</TD>\n";
print " <TD align=\"center\"><INPUT type=\"radio\" name=\"opt_del\" value=\"$num\"></TD>\n";
print " </TR>\n";
}
print <<"EOM";
<TR>
<TD colspan="3" align="center"><INPUT type="submit" name="btn_submit" value="実行"></TD>
</TR>
</TBODY>
</TABLE>
EOM
&task_after; # 後処理
exit ;
}
#------------------------------#
# 更新モード表示 #
#------------------------------#
sub disp_update {
&task_before; # 前処理
print <<"EOM";
<FORM action="$script">
<INPUT type="hidden" name="mode" value="execute">
<INPUT type="hidden" name="process" value="update">
<TABLE border="1" cellspacing="1">
<TBODY>
<TR bgcolor="#0080ff">
<TH>Num</TH>
<TH>Name</TH>
<TH>select</TH>
</TR>
EOM
while(@data = $sth -> fetchrow_array){
$num = $data[0];
$name = $data[1];
print " <TR>\n";
print " <TD>$num</TD>\n";
print " <TD>$name</TD>\n";
print " <TD align=\"center\"><INPUT type=\"radio\" name=\"opt_upd\" value=\"$num\"></TD>\n";
print " </TR>\n";
}
print <<"EOM";
<TR>
<TD>New Value</TD>
<TD colspan="2"><INPUT size="32" type="text" maxlength="32" name="tb_newname"></TD>
</TR>
<TR>
<TD colspan="3" align="center"><INPUT type="submit" name="btn_submit" value="実行"></TD>
</TR>
</TBODY>
</TABLE>
EOM
&task_after; # 後処理
exit ;
}
#------------------------------#
# 前処理 #
#------------------------------#
sub task_before {
&Out_Header; # HTML ヘッダー表示
&DB_Connect; # Open Database
$sth = $dbh->prepare("select * from $tbname;");
&DB_Execute; # Execute Command
}
#------------------------------#
# 後処理 #
#------------------------------#
sub task_after {
$sth -> finish(); # コマンド実行終了
&DB_DisConnect; # Close Databse
&Out_Footer; # HTML フッター表示
}
#------------------------------#
# レコード処理 #
#------------------------------#
sub execute {
#&debug; # デバッグ表示
if ($process eq "insert") {
$sql = "insert into meibo.user values(NULL,\"$in{'tb_addname'}\");";
}elsif ($process eq "delete") {
$sql = "delete from meibo.user where Num=$in{'opt_del'};";
}elsif ($process eq "update") {
$sql = "update meibo.user set Name=\"$in{'tb_newname'}\" where Num=$in{'opt_upd'};";
}else{
&error("処理モードが不正です。: $process");
}
&DB_Connect; # Open Database
$sth = $dbh->prepare($sql);
&DB_Execute; # Execute Command
$sth -> finish(); # コマンド実行終了
&DB_DisConnect; # Close Databse
&view; # 表示処理
}
#------------------------------#
# Decode #
#------------------------------#
sub decode {
local($buf, $key, $val);
$buf = $ENV{'QUERY_STRING'};
foreach (split(/&/, $buf)) {
($key, $val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}
$mode = $in{'mode'};
$process = $in{'process'};
}
#------------------------------#
# Connect Database #
#------------------------------#
sub DB_Connect {
# データベースアクセスの開始
$dbh = DBI -> connect ("DBI:mysql:$dbname:localhost",$dbusername,$dbpassword)
|| &error("データベースにアクセス出来ません。");
}
#------------------------------#
# Execute Command #
#------------------------------#
sub DB_Execute {
# コマンドの実行
$sth -> execute()
|| &error("データベース処理コマンドを実行出来ませんでした。$DBI::err ($DBI::errstr)");
}
#------------------------------#
# DisConnect Database #
#------------------------------#
sub DB_DisConnect {
# データベースアクセスの終了
$dbh -> disconnect();
}
#------------------------------#
# HTML Header #
#------------------------------#
sub Out_Header {
print "Content-type: text/html\n\n";
print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<TITLE>はじめての自宅サーバ構築 - データベース操作 〜 CGI編 〜 -</TITLE>
</HEAD>
<BODY>
<CENTER>
<a href=\"$script?mode=view\">[表示モード]</a>
<a href=\"$script?mode=disp_insert\">[追加モード]</a>
<a href=\"$script?mode=disp_delete\">[削除モード]</a>
<a href=\"$script?mode=disp_update\">[更新モード]</a>
<BR><BR>
EOM
}
#------------------------------#
# HTML Footer #
#------------------------------#
sub Out_Footer {
print <<"EOM";
</CENTER>
</BODY>
</HTML>
EOM
}
#------------------------------#
# Out Error Message #
#------------------------------#
sub error {
local($_) = @_;
&Out_Header; # HTML ヘッダー表示
print "<H2>$_</H2>\n";
&Out_Footer; # HTML フッター表示
exit ;
}
#------------------------------#
# デバッグ表示 #
#------------------------------#
sub debug {
&Out_Header; # HTML ヘッダー表示
print <<"EOM";
<TABLE border="1" cellspacing="1">
<TBODY>
<TR bgcolor="#0080ff">
<TH>Property</TH>
<TH>Value</TH>
</TR>
<TR>
<TD>mode</TD>
<TD>$mode</TD>
</TR>
<TR>
<TD>process</TD>
<TD>$process</TD>
</TR>
<TR>
<TD>tb_addname</TD>
<TD>$in{'tb_addname'}</TD>
</TR>
<TR>
<TD>opt_del</TD>
<TD>$in{'opt_del'}</TD>
</TR>
<TR>
<TD>opt_upd</TD>
<TD>$in{'opt_upd'}</TD>
</TR>
<TR>
<TD>tb_newname</TD>
<TD>$in{'tb_newname'}</TD>
</TR>
</TBODY>
</TABLE>
EOM
&Out_Footer; # HTML フッター表示
exit ;
}
__END__
|
作成したスクリプトの所有者とパーミッション変更
所有者の変更 # chown apache:apache /var/www/html/cgi-bin/OperatedMySQL.cgi パーミッションの変更 # chmod 755 /var/www/html/cgi-bin/OperatedMySQL.cgi |
ブラウザより『http://サーバのアドレス/cgi-bin/OperatedMySQL.cgi』でアクセスする。
下記の様な画面が表示されるので、「追加・削除・更新」等を行ってみて下さい。
