Webコミュニケーショングループ ~CGI勉強会

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