はじめての自宅サーバ構築 - Fedora/CentOS -
Last Update 2018/05/30
[ 更新履歴 ] [ サイト マップ ] [ 質問掲示板 ] [ 雑談掲示板 ] [ リンク ]
トップ >> データベースサーバ >> データベース操作(OperatedCGI) 〜 MySQL CGI編 〜
動作確認 [ FC1 / FC2 / FC3 / FC4 / FC5 / FC6 / Fedora7 / Fedora8 / Fedora9 / Fedora10 / Fedora11 / Fedora12 / Fedora13 / Fedora14 / Fedora15 / Fedora16 / Fedora17 / CentOS4 / CentOS5 / CentOS6 ]
  1. 前提条件
  2. Perlでデータベースを使用する
  3. データベースを使用する宣言を行う
  4. データベースに接続する
  5. データベースコマンド(SQL)の実行
  6. データベースを切断する
  7. サンプルスクリプト
  8. サンプルスクリプトの起動

■ 前提条件

サンプルは、主な使用方法のみです。トランザクションなどは考慮していません。
また、DBI等の使用法やPerlなどの言語仕様等は一切お答えいたしませんので、専門の紹介サイトで確認して下さい。

■ Perlでデータベースを使用する

Perlでデータベースを操作するにはDBIとDBDのモジュールが必要です

データベースサーバの構築(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:正常接続した時のデータベースハンドル

■ データベースコマンド(SQL)の実行

実行コマンドの構文
$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』でアクセスする。
下記の様な画面が表示されるので、「追加・削除・更新」等を行ってみて下さい。

■ コンテンツ関連

■ その他

ページ先頭へ

Copyright(©)2004-2018 First home server construction. All Right Reserved.