Webコミュニケーショングループ ~CGI勉強会~ (データーベース編) U4山本 健友 1 本日の予定 1. データベース(PostgreSQL)の利用 2. プログラム(Perl)からデータベースを操作 3. 簡易ブックマークサイトの作成 2 psqlの基本的な使い方 ・データベースの作成 $ createdb [データベース名] ・データベースの削除 $ dropdb [データベース名] ・データベースの一覧表示 $ psql –l ・データーベースに接続 $psql [データベース名] 3 テーブルの作成 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 4 テーブルの作成 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 (作成されたテーブルの確認) 5 メタコマンド ・データベースの一覧表示 test_db=> \list (\l) ・テーブルの一覧表示 test_db=> \d ・指定テーブルの情報表示 test_db=> \d [テーブル名] ・データベースの切断 test_db=> \q 6 データの挿入 ・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','知的システムデザイン研 究室'); 7 テーブルの検索 ・SELECT文 例)指定したテーブル内の全ての行を表示 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; 8 データの削除 ・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; 9 データベース利用の流れ 1. 2. 3. 4. 5. データベースに接続(connect) SQL文の準備(prepare) SQL文の実行(execute) 実行結果の取得(fetchrow_array等) 切断(disconnect) 10 データベースへの接続,切断 #!/usr/bin/perl -w use strict; use DBI; # 接続の設定 my $dbname = ‘test_db'; my $passwd = ‘testuser'; my $host = 'localhost'; my $user my $tbname = ‘testuser'; = 'kyamamoto_bookmark'; # データベースに接続 my $db = DBI->connect( "DBI:Pg:host=$host;dbname=$dbname", $user, $passwd ) || die "DBI connect failed : $DBI::errstr"; # SQL文の準備,実行 ・・・ # 実行結果の取得 ・・・ # 切断 $db->disconnect; 11 SQL文の準備,実行 ・SELECT文によるテーブル検索の実行 # SQL文の準備 my $sql my $st = "select * from $tbname"; = $db->prepare( "$sql" ); # SQL文の実行 my $res = $st->execute || die $DBI::errstr; 12 実行結果の取得 ・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 13 プログラムの作成 1. 挿入したデータをブラウザで確認できるようにしてください. 2. ブラウザからデータベースにデータをPOSTし,一覧で表 示確認ができる簡易ブックマークサイトを作成してください. 3. ブラウザからブックマークを削除できるようにしてください. 14 補足資料 文法チェック $ perl -cw [ファイル名] プログラムの実行 $ perl [ファイル名] ブラウザから実行するには権限を変更 $ chmod 755 [ファイル名] 15 前回の資料の一部 16 スカラ変数 • スカラ値(数値,文字列値,未定義値など) を1つだけ保持できる変数 $var = “123”; print “$var\n”; $value = $var + “456”; print “$value\n”; $value = $var . “456”; print “$value\n”; #数値の和を計算 #文字列の連結 実行例: 123 579 123456 17 スカラ変数 • スカラ変数では数値と文字列の区別は無く, スカラ値は自動的に数値あるいは文字列 に変換される • “・・・・・” 変数展開が行われる • ‘・・・・・’ 変数展開は行われない $var = “123”; print “$var\n”; print ‘$var\n’; 実行例: 123 $var\n 18 配列変数 @language = ( 'English', 'Japanese', 'Danish', 'German' ); # # # 上記と同じ意味 $language[0] = ‘Engilsh’; $language[2] = ‘Danish’; $language[1] = ‘Japanese’; $language[3] = ‘German’; foreach ( @language ){ print "$_\n"; } 実行例: English Japanese Danish German 19 ハッシュ変数 %hash = ( '氏名' => '山本健友', '性別' => '男', '住所' => '京都府京田辺市' ); # 上と同じ意味 # $hash{'氏名'} = '山本健友'; # $hash{'性別'} = '男'; # $hash{'住所'} = '京都府京田辺市'; foreach ( values %hash ){ print "$_\n"; } 実行例: 男 京都府京田辺市 山本健友 20 演算子 • • • • 算術演算子「+, -, *, /, %」 加算,減算「++, --」 比較演算子「==, !=, <, >, <=, >=」 文字列用比較演算子「eq(等しい), ne(等しくな い)」 21 条件分岐 • • 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. 22 繰り返し • • while(条件式){ブロック} for(初期化; 比較式; 終端式){ブロック} my $i = 0; while($i<5){ print "Hello, World\n"; $i++; } for(my $j=0; $j<5; $j++){ print "Hello, World\n"; } 23 繰り返し(foreach文) • 配列要素を順番に読み書きするためのもの • ハッシュ変数の操作にも利用可能 # 配列の要素を順番に出力 foreach $name (@subject){ print “$name\n”; } my %animals = (‘dog’=>’ Bow-Wow!!’, ‘cow’=>’mooo!!’); foreach (keys %animal){ print ”$_ : $animal{$_}\n”; } 24 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 25 CGIを書いてみる 2.ファイル名を「[名前].cgi」で保存 3.「\\kyamamoto\webcomi」に自分の名前のディレクトリを作成 し,そのディレクトリにコピー 4.ブラウザで 「http://172.20.11.96/webcomi/[ディレクトリ名]/[名前].cgi」 にアクセス 26 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> 27 </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 28 CGIへパラメータを送信 29
© Copyright 2024 ExpyDoc