情報科学III

平成21年度 情報科学III (理系コア科目・2年生)
PHP プログラムの実行(まとめ)
担当 岡村耕二
月曜日 2限
http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
1
以前の講義資料をもとにしています。
演習問題
 クライアントのWindows XP などで英数字でテキストファイルを作成し、その
ファイルに含まれる単語を、抽出し、表示するプログラムを作成せよ。
 例
– This is a pen. Is this a pen,too? Yes, it is.
– 出力結果
• this (2)
• is (3)
• a(2)
• pen(2)
• too(1)
• yes (1)
• it(1)
– 単語は出現頻度やアルファベット順にソーティングできると、なおよい。
2
単語の抽出(回答例:http://bossp.is.kyushu-u.ac.jp/~oka/20090525/10/main.html)
$nlines=0;
$nwords=0;
if($c==$nwords){
$www[$nwords]=strtolower($words[$nline
s][$j]);
while(strlen($lines[$nlines])>0){
printf("(%d) %s<br>",$nwords,$www[$nw
ords]);
$wwwc[$nwords]=1;
$nwords++;
$words[$nlines]=str_word_count($lines[$nl
ines],1);
print_r($words[$nlines]);
printf("<br>");
$j=0;
while(strlen($words[$nlines][$j])>0){
for($c=0;$c<$nwords;$c++){
if(strcasecmp($www[$c],$words[$nlines][$
j])==0){
$wwwc[$c]++;
break;
}
}
$j++;
}
printf("<BR>");
$nlines++;
}
}
3
前回のおさらい(1)
 PHPプログラムの処理形態
1. PHP処理モジュールがインストールされている web サーバ
上で,web サーバ経由で実行させる.
2. PHPがコマンドラインで実行できるようにインストールされて
いるサーバ上で,コマンドラインから起動する.
 PHPプログラムの入出力
– コマンドラインから実行される場合は簡単
• ディスプレイ,キーボード,ファイル
– webサーバから実行される場合は,単純ではない.
4
前回のおさらい(2)
 webサーバで実行されるPHPプログラムの入出力
– HTTPの力を借りる.
• 入力は,HTTPリクエストから受け取る.
• 出力は,HTTPレスポンスに埋め込む.
HTTP
リクエ
スト
クライアント
インター
ネット
HTTP
レスポ
ンス
実行中の
PHPプログラム
web
サーバ
PHP
処理
モジュー
ル
5
前回のおさらい(3)
 クライアントへの間接的な出力
– HTML データに print( ) の出力が埋め込まれる.
– ステータス行やメッセージヘッダが自動的に付加される.
PHP
プログラム
PHPからの出
力を含むweb
ページ
print( ) で出力すると,そ
の内容がHTMLデータに
埋め込まれてクライアント
に返送される.
6
前回のおさらい(4)
 クライアントからの間接的な入力
– HTMLの <form> ~ </form>タグを用いる.
– submit タイプのボタンがクリックされると,集めた内容を
HTTP で送信する.
利用者の入
力データを
フォームに含
むwebページ
利用者の
入力を処理
するPHP
プログラム
<form> タグのあるページで
入力を集めて,PHPプログラムに送る.
7
前回のおさらい(5)
 <form> ~ </form> タグ
– method:ブラウザに入力されたデータをサーバに送信する
ときの形式
(GETまたはPOST)
• GET:データをURLの末尾に追加して送信する.
• POST:データをURLとは別に送信する.
– action:集めたデータの送信先のURL
• 通常は,PHPプログラム(HTML埋め込みも可)または
CGIプログラム
<form method="メソッド名" action="URL" ...>
...
</form>
8
前回のおさらい(6)
 実際の入力部分は,<input> タグで
<form method="メソッド名" action="URL" ...>
<input type="タイプ名" name="項目名">
<input type="タイプ名" name="項目名">
...
</form>
9
前回のおさらい(7)
 <input>タグの例
– <input type="submit" name="名前"...> :送信ボタン
– <input type="text" name="名前"...> :1行の入力欄
 他に
– "radio"(ラジオボタン),"password"(パスワード形式の入力欄),
"checkbox" (チェックボックス),"file"(ファイルの送信欄),
"hidden"(隠しデータ),
– <textarea name="名前" ...> ~</textarea>
(複数行の入力欄)
– <select name="名前">
<option value="値">選択肢の名前</option>
...
</select>
(プルダウンメニュー)
10
前回の補足と訂正
 複数選択の可能な "checkbox" タイプの入力欄
– <input> タグの name 属性の値は,複数選択された場合
にはPHPの配列に格納されるように,"q2[]" のような名前
にしておくとよい.
<p>
質問1 あなたの好きな果物は?(複数選択可)
<br>
<input type="checkbox" name="q2[]" value="リンゴ">リンゴ
<input type="checkbox" name="q2[]" value="バナナ">バナナ
<input type="checkbox" name="q2[]" value="キウイ">キウイ
</p>
11
PHPと入出力(承前)
12
外部からのデータの受け取り方(1)
 入力データをPHPプログラムへ送るのは <form> ~ </form>
を使えばよいとして…
 受け側のPHPプログラムでは,<form> ~ </form> タグから
送られてきたデータをどのようにして受け取ればよいか?
?
入力された
データ
HTML
ファイル
受け側の
PHP
プログラム
POST
またはGET
<form> タグのあるページで
入力を集めて,PHPプログラムに送る.
13
外部からのデータの受け取り方(2)
 PHPプログラムの外部から送り込まれるデータ
– <form> ~ </form> タグで集める利用者入力データ以外
のものもある.
• PHPプログラムを実行しているwebサーバに関する情報
• PHPプログラム自身に関する情報(ファイル名など)
プログラム
自身の情報
POST
またはGET
利用者が入力
HTML
したデータ
ファイル
受け側の
PHP
プログラム
サーバの
情報
14
外部からのデータの受け取り方(3)
 webサーバ経由で起動されたPHPプログラムには,外部から来
るデータが自動的に格納される,定義済みの連想配列がある.
– $_SERVER["名前"]
– $_ENV["名前"]
– $_POST["名前"]
– $_GET["名前"]
 PHPプログラムがwebサーバ経由で起動されると,上記の配列
はすでにアクセス可能になっている.
– 要素には値もセットされている.
15
$_SERVER['名前']と$_ENV['名前']
 $_SERVER["名前"]
– そのPHPプログラムを実行しているwebサーバに関する情報
たとえば:
• $_SERVER["HTTP_HOST"] :サーバのホスト名
• $_SERVER["SERVER_ADDR"] :サーバのIPアドレス
• $_SERVER["HTTP_USER_AGENT"] :そのPHPプロ
グラムにアクセスしてきたクライアントがサーバに対して名
乗っているブラウザ名
 $_ENV["名前"]
– そのPHPプログラムが実行されるときの環境に関する情報
16
これらの連想配列の内容を確認する方法
 phpinfo( ) 関数を実行する
– 第4回のスライドで紹介した.
<?php phpinfo(); ?>
17
$_POST['名前']
 そのPHPプログラムに対して,POSTメソッドで送り込まれたデー
タ
$_POST["名前"]
入力された
データ
入力された
データ
HTML
ファイル
POST
受け側の
PHP
プログラム
<form> タグのあるページで
入力を集めて,PHPプログラムに送る.
18
$_GET['名前']
 そのPHPプログラムに対して,GETメソッドで送り込まれたデータ
$_GET["名前"]
入力された
データ
入力された
データ
HTML
ファイル
GET
受け側の
PHP
プログラム
<form> タグのあるページで
入力を集めて,PHPプログラムに送る.
19
連想配列 $_POST[ ] ($_GET[ ] )のキー
 <input> (<textarea>,<select>)タグの中で指定され
た name 属性の値が,これらの連想配列のキー(要素を特定す
るための名前)になる.
$_POST["key1"]
入力データ
入力データ
HTML
ファイル
POST
受け側の
PHP
プログラム
<input type="text" name="key1">
20
2段以上のPOST/GET
 <form> タグで集めたデータを受け取った PHP プログラムが,
さらに次の PHP プログラムにデータを伝えるための <form> タ
グを含むことがある.
データを入力
して,送信ボタ
ンをクリック
HTML
ファイル
POST/GET
さらにデータを
入力して,また
送信ボタンを
クリック
受け側の
PHP
プログラム
POST/GET
受け側の
PHP
プログラム
21
POST/GETしたデータの到達範囲
 そのときの POST(GET) メソッドで送信されたデータが,送信先
のPHPプログラムの $_POST[ ] ($_GET[ ])連想配列に入
る.
$_POST["key1"]
($_GET["key1"])
入力データ
1
入力データ
2
HTML
ファイル
受け側の
PHP
プログラム1
POST/GET
ここで送信されるデータは,
そのままでは,プログラム
2には伝わらない.
$_POST["key1"]
($_GET["key1"])
POST/GET
受け側の
PHP
プログラム2
22
入力されたデータを2段以上先まで伝える方法
 いくつか方法はあるが,簡単なものは:
– "hidden" タイプの <input> タグで
$_POST["key1"]
($_GET["key1"])
入力データ
1
入力データ
2
HTML
ファイル
受け側の
PHP
プログラム1
<input
type="text"
name="key1">
POST/GET
$_POST["key1"]
$_POST["key2"]
($_GET["key1"])
($_GET["key2"])
POST/GET
<input type="hidden" name="key1"
value="$_POST["key1"]">
<input type="text" name="key2">
受け側の
PHP
プログラム2
心情的には,
こうしたいが,
文法的に×
23
php プログラミング
 基本的な文法を用いる。
– 分岐、ループ
 配列を用いる。
 文字列を扱う。
 HTML から、入力したデータを渡してもらう。
 HTML から、ファイルでデータを渡してもらう。
24
練習問題
 ファイルに、
– 品物名
– 単価
– の情報の入ったものを用意し、
– 1)そのファイルをアップロードし、
– 2)品物、単価を修正可能なようにHTMLで表示を行い
• ヒント: INPUT タグでは value 属性を用いる。
– 3)指定した数量の合計金額の計算を行える
– プログラムを作成せよ。
 ただし、品物と単価は、3組に限定してよい。
 ファイルのフォーマットは好きに決めてよい。
25
演習問題
 ファイルに、
– 品物名
– 単価
– の情報の入ったものを用意し、
– 1)そのファイルをアップロードし、
– 2)品物、単価を修正可能なようにHTMLで表示を行い
– 3)指定した数量の合計金額の計算を行える
– プログラムを作成せよ。
 品物と単価は、テキストファイルに書かれている分、全てを対象
にできること。
 重複した品物がある場合は、金額の高い単価の情報を採用で
きること。
26