Webコミュニケーショングループ ~CGI勉強会~ (データーベース編) U4山本 健友
本日の予定 データベース(PostgreSQL)の利用 プログラム(Perl)からデータベースを操作 簡易ブックマークサイトの作成
psqlの基本的な使い方 ・データベースの作成 ・データベースの削除 ・データベースの一覧表示 $ createdb [データベース名] $ dropdb [データベース名] ・データベースの一覧表示 $ psql –l ・データーベースに接続 $psql [データベース名]
テーブルの作成 1 id url title description timestamp 1 http://www.google.com/ Google 検索サイト 2005-12-20 13:51:34 2 http://www.yahoo.com/ Yahoo! 2005-12-20 13:51:57 3 http://www.hatena.ne.jp/ はてな 人力検索サイト 2005-12-20 13:52:11
テーブルの作成 2 ・以下の内容のファイルを作成(createtable.sql) create table kyamamoto_bookmark ( id serial primary key, url varchar(255) not null, title varchar(255) not null, description text, timestamp timestamp default now() ); ・バッチファイル(SQL文のスクリプトファイル)の実行 test_db=> \i ‘/home/testuser/・・・/createtable.sql’ test_db=> \d (作成されたテーブルの確認)
メタコマンド ・データベースの一覧表示 ・テーブルの一覧表示 ・指定テーブルの情報表示 ・データベースの切断 test_db=> \list (\l) ・テーブルの一覧表示 test_db=> \d ・指定テーブルの情報表示 test_db=> \d [テーブル名] ・データベースの切断 test_db=> \q
データの挿入 ・INSERT文 書式: test_db=> insert into [テーブル名] (column, ・・・) values (expression, ・・・); ・column: データを挿入する列名 ・expression: 挿入する値 例) test_db=> insert into kyamamoto_bookmark (url, title, description) values ('http://mikilab.doshisha.ac.jp/','mikilab','知的システムデザイン研 究室');
テーブルの検索 ・SELECT文 ・WHERE句(検索条件の指定) 例)指定したテーブル内の全ての行を表示 test_db=> select * from kyamamoto_bookmark; 例)指定したテーブル内の列名url,titleの全ての行を表示 test_db=> select url, title from kyamamoto_bookmark; ・WHERE句(検索条件の指定) 例)urlに「.com」を含む行を表示 test_db=> select * from kyamamoto_bookmark where url ~ ‘\\.com’; 例)列名idが5の行を表示 test_db=> select * from kyamamoto_bookmark where id = 5;
データの削除 ・DELETE文 注)WHERE句で条件を指定していない場合, 全てのデータが削除されるので注意 例)指定したテーブルの全てのデータを削除 test_db=> delete from kyamamoto_bookmark; ・全データ削除の場合TRUNCATE文のほうが高速 例)test_db=> truncate from kyamamoto_bookmark; 例)列名idが5の行を削除 test_db=> delete from kyamamoto_bookmark where id=5;
データベース利用の流れ データベースに接続(connect) SQL文の準備(prepare) SQL文の実行(execute) 実行結果の取得(fetchrow_array等) 切断(disconnect)
データベースへの接続,切断 #!/usr/bin/perl -w use strict; use DBI; # 接続の設定 my $dbname = ‘test_db'; my $user = ‘testuser'; my $passwd = ‘testuser'; my $tbname = 'kyamamoto_bookmark'; my $host = 'localhost'; # データベースに接続 my $db = DBI->connect( "DBI:Pg:host=$host;dbname=$dbname", $user, $passwd ) || die "DBI connect failed : $DBI::errstr"; # SQL文の準備,実行 ・・・ # 実行結果の取得 # 切断 $db->disconnect;
SQL文の準備,実行 ・SELECT文によるテーブル検索の実行 # SQL文の準備 my $sql = "select * from $tbname"; my $st = $db->prepare( "$sql" ); # SQL文の実行 my $res = $st->execute || die $DBI::errstr;
実行結果の取得 ・fetchrow_arrayメソッドとwhile文により実行結果を一行ずつ取得し,配列に格納 while ( my @values = $st->fetchrow_array ){ print “$values[0]\t$values[1]\t$values[2]\t$values[3]\t$values[4]\n”; } 実行例) 1 http://www.yahoo.com/ Yahoo! 検索サイト 2005-12-22 22:49:45 2 http://www.google.com/ Google 検索サイト 2005-12-22 22:50:03 3 http://www.hatena.ne.jp/ はてな 人力検索サイト 2005-12-23 01:27:10
プログラムの作成 挿入したデータをブラウザで確認できるようにしてください. ブラウザからデータベースにデータをPOSTし,一覧で表示確認ができる簡易ブックマークサイトを作成してください. ブラウザからブックマークを削除できるようにしてください.
補足資料 文法チェック $ perl -cw [ファイル名] プログラムの実行 $ perl [ファイル名] ブラウザから実行するには権限を変更 $ chmod 755 [ファイル名]
前回の資料の一部
スカラ変数 スカラ値(数値,文字列値,未定義値など)を1つだけ保持できる変数 $var = “123”; print “$var\n”; $value = $var + “456”; #数値の和を計算 print “$value\n”; $value = $var . “456”; #文字列の連結 実行例: 123 579 123456
スカラ変数 スカラ変数では数値と文字列の区別は無く,スカラ値は自動的に数値あるいは文字列に変換される “・・・・・” 変数展開が行われる “・・・・・” 変数展開が行われる ‘・・・・・’ 変数展開は行われない $var = “123”; print “$var\n”; print ‘$var\n’; 実行例: 123 $var\n
配列変数 @language = ( 'English', 'Japanese', 'Danish', 'German' ); # 上記と同じ意味 # $language[0] = ‘Engilsh’; $language[1] = ‘Japanese’; # $language[2] = ‘Danish’; $language[3] = ‘German’; foreach ( @language ){ print "$_\n"; } 実行例: English Japanese Danish German
ハッシュ変数 %hash = ( '氏名' => '山本健友', '性別' => '男', '住所' => '京都府京田辺市' ); # 上と同じ意味 # $hash{'氏名'} = '山本健友'; # $hash{'性別'} = '男'; # $hash{'住所'} = '京都府京田辺市'; foreach ( values %hash ){ print "$_\n"; } 実行例: 男 京都府京田辺市 山本健友
演算子 算術演算子「+, -, *, /, %」 加算,減算「++, --」 比較演算子「==, !=, <, >, <=, >=」 文字列用比較演算子「eq(等しい), ne(等しくない)」
条件分岐 if(条件式){ブロック} If(条件式:1){ブロック:1}elsif(条件式:2){ブロック:2}else{ブロック:3} my $my_favorite = "orange"; print "What is your favorite fruit?"; chomp(my $your_favorite = <STDIN>); if($my_favorite eq $your_favorite){ print "Me, too!\n"; } else{ print "I love ${my_favorite}s.\n"; } 実行例: $ perl furuit.pl What is your favorite fruit?orange Me, too! $ perl fruit.pl What is your favorite fruit?banana I love oranges.
繰り返し while(条件式){ブロック} for(初期化; 比較式; 終端式){ブロック} my $i = 0; while($i<5){ print "Hello, World\n"; $i++; } for(my $j=0; $j<5; $j++){
繰り返し(foreach文) 配列要素を順番に読み書きするためのもの ハッシュ変数の操作にも利用可能 # 配列の要素を順番に出力 foreach $name (@subject){ print “$name\n”; } my %animals = (‘dog’=>’ Bow-Wow!!’, ‘cow’=>’mooo!!’); foreach (keys %animal){ print ”$_ : $animal{$_}\n”;
CGIを書いてみる 1.メモ帳,秀丸等で以下のソースを記入 #!C:/perl/bin/perl -w use strict; print <<END_OF_HTML; content-type: text/html <html> <head> <title>Hello CGI</title> </head> <body> <h1>Hello CGI!!</h1> </body> </html> END_OF_HTML
CGIを書いてみる 2.ファイル名を「[名前].cgi」で保存 3.「\\kyamamoto\webcomi」に自分の名前のディレクトリを作成し,そのディレクトリにコピー 4.ブラウザで 「http://172.20.11.96/webcomi/[ディレクトリ名]/[名前].cgi」 にアクセス
CGIへパラメータを送信 <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP"> <title>名前の入力</title> </head> <BODY> <form action="./decode.cgi"> お名前: <input type="text" name="your_name"> <input type="Submit" value="送信"> </form> </BODY> </html>
CGIへパラメータを送信 #!C:/perl/bin/perl use CGI; # CGIモジュールを使用 $cgi=new CGI; $your_name = $cgi->param(“your_name”); # ここでパラメータを受け取る print <<HTML; Content-type: text/html <html><head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS"> <title>結果</title></head> <BODY> $your_nameさん、いらしゃいませ </BODY></html> HTML
CGIへパラメータを送信