情報科学III

平成21年度 情報科学III (理系コア科目・2年生)
PHP プログラムの実行
担当 岡村耕二
月曜日 2限
http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/
本資料の一部は、堀良彰准教授、天野浩文准教授等による
1
以前の講義資料をもとにしています。
演習の回答例
• a, b, c を入力して、2次方程式を解くプログラ
ムを作成せよ。
– aX^2 + bX = C
• 名前、数字を5名分入力し、数字の順に並び
替えるプログラムを作成せよ。
– 入力画面および入力例
箱崎
12
六本松
9
– 出力例
馬出
22
•
•
•
•
•
伊都
4
大橋
29
大橋 29
馬出 22
箱崎 12
六本松 9
伊都 4
2
演習 1: http://bossp.is.kyushu-u.ac.jp/~oka/20090518/10/main.html
メイン
if($d>0){
printf(" x = (%d + SQRT(%d))/%d and (%d - SQRT(%d))/%d
<br>\n",
($b * -1),$d,2 * $a,
($b * -1),$d,2 * $a
);
printf("or x = %.3f and %.3f \n",
(($b * -1) + sqrt($d)) / (2 * $a),
(($b * -1) - sqrt($d)) / (2 * $a)
);
<form method="POST" ACTION="niji.php"><p>
a=<input type="text" name="a" size="4"><p>
b=<input type="text" name="b" size="4"><p>
c=<input type="text" name="c" size="4"><p>
<input type="submit" value="Go!">
<input type="reset" value="Clear">
</form>
式を解く
}elseif ($d==0) {
$a=$_POST["a"];
$b=$_POST["b"];
$c=$_POST["c"];
printf("a=%d,b=%d,c=%d <p>\n",$a,$b,$c);
printf(" x = %d/%d. <br>\n",($b * -1),2 * $a);
printf("or x = %.3f.", ($b * -1)/(2 * $a));
}elseif ($d <0){
$c = $c * -1;
$d = $b * $b - 4 * $a * $c;
printf(" x = (%d + SQRT(%d)i)/%d and (%d SQRT(%d)i)/%d <br>\n",
($b * -1),$d * -1 ,2 * $a,
($b * -1),$d * -1 ,2 * $a
);
printf("or x = %.3f + %.3fi and %.3f + %.3fi.",
($b * -1)/(2 * $a), sqrt($d * -1)/(2* $a),
($b * -1)/(2 * $a), sqrt($d * -1)/(2* $a)
);
printf("D=%d <p>\n",$d);
printf("<HR>");
}
3
演習 2: http://bossp.is.kyushu-u.ac.jp/~oka/20080518/11/main.html
メイン
ソート
<form method="POST" ACTION="sort.php"><p>
name0=<input type="text" name="name0" size="4">
val0=<input type="text" name="val0" size="4"><p>
name1=<input type="text" name="name1" size="4">
val1=<input type="text" name="val1" size="4"><p>
name2=<input type="text" name="name2" size="4">
val2=<input type="text" name="val2" size="4"><p>
name3=<input type="text" name="name3" size="4">
val3=<input type="text" name="val3" size="4"><p>
name4=<input type="text" name="name4" size="4">
val4=<input type="text" name="val4" size="4"><p>
<input type="submit" value="Sort!">
<input type="reset" value="Clear">
</form>
$name=array($_POST["name0"],$_POST["name1"],$_POST["n
ame2"],$_POST["name3"],$_P\
OST["name4"]);
$val=array($_POST["val0"],$_POST["val1"],$_POST["val2"],$
_POST["val3"],$_POST["\
val4"]);
for($i=0;$i<5;$i++)
printf("%d %s %d \n<br>",$i,$name[$i],$val[$i]);
printf("<HR>");
for($i=0;$i<4;$i++){
for($j=$i+1;$j<5;$j++)
if($val[$i] < $val[$j]){
$tmp=$val[$i];
$val[$i]=$val[$j];
$val[$j]=$tmp;
$tmp=$name[$i];
$name[$i]=$name[$j];
$name[$j]=$tmp;
}
}
for($i=0;$i<5;$i++)
printf("%d %s %d <br>",$i,$name[$i],$val[$i]);
4
前回のおさらい(1)
 配列(array)
– 複数の値をリストとしてまとめて格納する.
• ひとつひとつの値を要素(element)と呼ぶ.
– 番号で要素を特定するものと,名前で要素を特定するもの
がある.
$fruit[1] = "banana"; // 番号で要素を識別する配列の例
$fruit[0] = "apple";
$fruit[2] = "みかん";
$profile["sex"] = "男"; // 名前で要素を識別する配列(連想配列)の例
$profile["age"] = 20;
$profile["country"] = "Japan";
 多次元の配列も作れる.
5
配列を模式的に書くと
 番号で要素を区別する配列の場合
"banana"
"みかん"
"apple"
必要に応じて伸びていく
$fruit[0]
$fruit[2]
$fruit[1]
 連想配列の場合
20
"Japan"
実は,並んでいる順番は
あまり重要でない.
"男"
必要に応じて伸びていく
$profile["sex"]
$profile["country"]
$profile["age"]
6
前回のおさらい(2)
 関数(function)
– ( )で囲まれたデータ(引数)を受け取り,何かの処理をして,
結果を返す.
– 「引数」は「ひきすう」と読む.
 ほとんどの場合,実行結果は,変数に直接代入できる.
– 実行結果として返される値は,「戻り値」と呼ばれる.
– 戻り値がのちのち必要になる場合は,いったん変数で受け
取っておいて,その変数を利用するとよい.
戻り値を受け取る変数 = 関数名( 引数 );
7
前回のおさらい(3)
 PHPプログラムがうまく実行されないときのチェックリスト
– HTMLの開始タグ・終了タグはきちんと対応が取れている
か?
• 例:<head> ~ </head>
– PHPの開始タグ・終了タグはきちんと対応が取れているか?
• <?php ~ ?>
– ( ~ ),{ ~ }," ~ ",などの対応は取れているか?
– あるべきところにセミコロンがあるか?
– 連想配列に値をセットするとき/値を読むとき,キーの名前
を打ち間違えていないか?
• 例: $message["Wed"] と $message["Wen"];
8
print( ) に関する補足と訂正
 第4回のスライドでは,以下のように説明していた.
– print( ) は関数である.
– print( ) は論理型の値を返す.
 正しくは,以下の通りであった.
http://www.php.net/manual/ja/function.print.php
(関数レファレンスの中に書かれてはいるけれど…)
– 厳密に言うと,実は print( ) は関数ではなく PHP言語が
持つ特殊な構文構造であり,括弧を省略することもできる.
– print または print( ) を実行した結果の値(戻り値)は,
常に1である.
9
今日勉強すること
 PHPの実行形態
 PHPと入出力(おさらい)
 PHPとファイル処理
10
PHPの実行形態
11
PHPはプログラミング言語である
 ここまでの講義では,HTML 文書に埋め込むような使い方だけ
を扱ってきたが:
– 実は,PHPのみでプログラムを書き,webサーバ抜きで実行
することもできる.
 bossp のように,PHP処理系がコマンドラインからでも実行できる
ようにインストールされているサーバでは,以下のような形式で
も実行できる.
[te999999@bossp ~]$ php PHPのファイル名
– web ブラウザでアクセスしたときに何の表示も出ないようなと
きには,これによって何がおかしいのかを知ることができるか
も知れない.
12
PHPプログラムをコマンドラインから実行すると…
 ミニ実習
– これまでに作ったPHPプログラムをコマンドラインから実行し
てみよう
• Tera Term (TTSSH) で bossp に接続して,PHPプログラ
ムの入っているディレクトリ(~/public_html)まで cd
して実行
[te999999@bossp ~]$ cd public_html
[te999999@bossp ~]$ php PHPのファイル名
 何がおきるか?
13
PHPプログラムの実行形態(まとめ)
1. PHP処理モジュールがインストールされている web サーバ上で,
web サーバ経由で実行させる.
• PHPプログラムを実行した結果が,HTMLデータに埋め込ま
れて,ブラウザに返される.
2. PHPがコマンドラインで実行できるようにインストールされている
サーバ上で,コマンドラインから起動する.
• PHPプログラムを実行した結果が,ディスプレイ上に表示さ
れる.
• 実際には:
– HTTPレスポンスの一部も合わせて出力される.
– 純粋のPHPだけでなく,HTML埋め込みのPHPも処理で
きる.
14
PHPと入出力
15
プログラムにとっての入出力(1)
 プログラムを実行するときには,普通は,外部から与えたデータ
を元に計算をさせたり,計算した結果を後に(外に)残したりし
たいことが多い.
– 実行時に外部から何のデータも持ってこない(あるいは,外
部の影響をまったく受けない)プログラムがあったとしたら:
• 何度実行しても同じ実行結果しか生み出せない.
• 2回以上実行する意味がどれだけあるか?
– 実行時に得られた計算結果を外部に引き渡さない(あるい
は,外部に何の影響も残さない)プログラムがあったとした
ら:
• 何を計算してもその結果を知る方法がない.
• そもそも,実行する意味があるか?
16
プログラムにとっての入出力(2)
 入力(input)
– プログラムに対して,外部から与えられるデータ
– 入力の例
• Enterキーが押されるまでの間にキーボードから打ち込ま
れた文字列
• ファイルの中に格納されていた文字列や数値
 出力(output)
– プログラムが,外部に対して与える(残す)データ
– 出力の例
• ディスプレイの画面に表示される文字列
• ファイルの中に保存される文字列や数値
17
プログラムにとっての入出力(3)
 通常のプログラムの典型的な実行形態
– 入力はキーボードから
– 出力はディスプレイに
実行中の
プログラム
18
プログラムにとっての入出力(4)
 場合によっては,入力や出力をファイルに対して行うこともある.
実行中の
プログラム
19
標準入出力
 多くのオペレーティングシステムでは,実行開始されたプログラ
ムに,以下の3種類の入力・出力をあらかじめ与えている.
– 標準入力(standard input)
• デフォルトでは,キーボードから
– 標準出力(standard output)
• デフォルトでは,ディスプレイに
– 標準エラー出力(standard error output)
• デフォルトでは,ディスプレイに
 出力が2つに分かれているのは…
– 正常に処理できたときのメッセージ等と,何か問題が起きた
ときのメッセージ等を分離して保存しやすくするため.
20
コマンドラインから実行されるPHPプログラム
 標準出力・標準エラー出力をディスプレイに出せる.
 キーボードからの標準入力を受けることもできる. ただし,適切な
関数を呼び出
 ファイルに対する入出力もできる.
す必要がある.
インターネット
実行中の
PHPプログラム
TTSSH
SSHが提供する「回廊」
21
webサーバ経由で実行されるPHPプログラム(1)
 サーバ上のファイルに対する入出力
– これもあまり問題はない.
– 実際,このような機能を提供するための関数もいろいろと用
意されている.
サーバ
実行中の
PHPプログラム
インターネット
web
サーバ
PHP
処理
モジュー
ル
22
webサーバ経由で実行されるPHPプログラム(2)
 クライアントに対する入出力?
– ところが,webサーバ上で実行中のPHPプログラムからは,ク
ライアントのキーボードやディスプレイが直接には見えない.
– 「標準入出力」の考えは,この実行形態にあまりなじまない.
実行中の
PHPプログラム
クライアント
インターネット
?
web
サーバ
PHP
処理
モジュー
ル
23
ではどうやって入出力するか?
 しかたがないので,HTTPの力を借りる.
– 入力は,HTTPリクエストから受け取る.
– 出力は,HTTPレスポンスに埋め込む.
HTTP
リクエスト
クライアント
インター
ネット
HTTP
レスポンス
実行中の
PHPプログラム
web
サーバ
PHP
処理
モジュー
ル
24
クライアントへの間接的な出力
 これは,print( ) の呼び出しで簡単に実現できる.
– ステータス行やメッセージヘッダは自動的に付加される.
HTTPレスポンス
PHPプログラム
ステータス行
<html>
<head>
...
</head>
<body>
<?php
print("Hello, World!\n");
?>
</body>
</html>
メッセージヘッダ
(ない場合もある)
(空行)
<html>
<head>
...
</head>
<body>
Hello, World!
</body>
</html>
25
クライアントからの間接的な入力
 HTMLの <form> タグを用いる.
– ブラウザ画面内で入力された内容を集める.
• 入力させる内容は <input> タグで指定する.
– submit タイプのボタンがクリックされると,集めた内容を
HTTP で送信する.
– reset タイプのボタンがクリックされると,ブラウザに入力さ
れた内容をクリアする.
<form method="メソッド名" action="URL">
<input ... >
...
<input type="submit" value="送信">
<input type="reset" value="クリア">
</form>
26
<form> タグ(1)
 <form>タグの詳細
<form method="メソッド名" action="URL" ...>
...
</form>
– method:ブラウザに入力されたデータの送信形式
(GETまたはPOST)
• GET:データをURLの末尾に追加して送信する.送信できるデータ
量には制限がある.
• POST:データをURLとは別に送信する形式.一度に大量のデータ
を送信することもできる.
– action:集めたデータの送信先のURL
• 通常は,PHPプログラム(HTML埋め込みも可)またはCGIプログラム
• このファイルと同じディレクトリにあるときには,ファイル名だけでも可.
27
<form> タグ(2)
 <form>タグによるデータ受け渡しの様子
– <form>タグを含むwebページを表示中に,submit タイプ
のボタンをクリック
– 入力されていた内容が,action 先のプログラムに渡される.
HTTP
リクエスト
クライアント
web
サーバ
PHP
処理
モジュー
ル
28
<form> タグ(3)
 <form>タグは,PHPだけでなく,CGIプログラムに対するデー
タ入力の方法としても用いられる.
 CGI(Common Gateway Interface)
– webサーバに,webブラウザからの要求に応じてプログラム
を起動させるためのしくみ
– よく用いられるのは Perl で書かれたスクリプト
 入力データを集める最初の web ページは,HTMLだけで書い
てもよいし,CGIプログラムやPHP(HTML埋め込みを含む)を
使って書いてもよい.
 ファイルをアップロードするようなときは,method,action の
他に enctype 属性も指定する必要がある.
29
<input> タグのいろいろ(1)
 <input type="text" name="名前"...>
– 1行のテキストの入力欄を作る.
– name は項目を区別するための名前.項目ごとに違う名前
を指定する.
– size,maxlength 属性の指定ができる.
– value を指定すると,あらかじめ文字列を入れておくことが
できる.
<p>
簡単なテキスト入力欄の例
<input type="text" name="text1">
</p>
30
<input> タグのいろいろ(2)
 <input type="password" name="名前" ...>
– パスワード形式の入力欄を作る.ここに入力される内容は
画面上ではすべてアスタリスク(*)となる.
– name は項目を区別するための名前.項目ごとに違う名前
を指定する.
– size,maxlength 属性の指定ができる.
– value を指定すると,あらかじめ文字列を入れておくことが
できる.ただし,これもすべてアスタリスク(*)となる.
<p>
簡単なパスワード入力欄
<input type="password" name="password1">
</p>
31
<input> タグのいろいろ(3)
 <input type="radio" name="名前" ...>
– ラジオボタンを作る.選択されたボタンの value が送信さ
れる.
– name は項目を区別するための名前.選択肢全体で共通の
名前を付ける.
– 同じ name を付けることで複数のラジオボタンがグループ化
され,そのグループ内では,1つしか選択できない.
– checked 指定したボタンは最初から選択された状態になる.
<p>
簡単なラジオボタンの例:PHPを使ったことがありますか?
<br>
<input type="radio" name="q1" value="はい">はい
<input type="radio" name="q1" value="いいえ">いいえ
</p>
32
<input> タグのいろいろ(4)
 <input type="checkbox" name="名前"...>
– チェックボックスを作る.選択されたボタンの value が送信される.
– name は項目を区別するための名前.
• 選択肢全体で共通の名前を付ける.
• 後ろに [] を付ける(説明は次回).
– 同じ name を付けることで複数のチェックボックスがグループ化され,そ
のグループ内で複数選択できる.
– checked 指定したボタンは最初から選択された状態になる.
<p>
質問1 あなたの好きな果物は?(複数選択可)
<br>
<input type="checkbox" name="q2[]" value="リンゴ">リンゴ
<input type="checkbox" name="q2[]" value="バナナ">バナナ
<input type="checkbox" name="q2[]" value="キウイ">キウイ
</p>
33
<input> タグのいろいろ(5)
 <input type="file" name="名前" ...>
– ファイルの送信欄を作る.自動的に「参照...」または
「Browse...」ボタンが表示される.
– name は項目を区別するための名前.項目ごとに違う名前
を指定する.
– size を指定すると,入力欄の横幅を決められる.
<p>
送信するファイル:
<br>
<input type="file" name="uploadfile1">
</p>
34
<input> タグのいろいろ(6)
 <input type="hidden" name="名前" ...>
– ブラウザ画面には表示されない「隠しデータ」を送信する.
– name は項目を区別するための名前.項目ごとに違う名前
を指定する.
<p>
<input type="hidden" name="title" value="非表示データ">
</p>
35
その他のタグ(1)
 <textarea name="名前" ...> </textarea>
– 複数行のテキスト入力欄を作る.
– name は項目を区別するための名前.項目ごとに違う名前
を指定する.
– cols,rows で入力欄の横幅,高さを決められる.wrap で
自動改行のタイプを指定できる.
– このタグで囲まれた部分に文字列を入れておくと,あらかじ
めその文字列が入力された状態になる.
<p>
テキストエリアの例:
<br>
<textarea name="message1">ここを編集</textarea>
</p>
36
その他のタグ(2)
 <select name="名前">
<option value="値">選択肢の名前</option>
...
</select>
– プルダウンメニューを作る.どれかの選択肢が選択されたと
き,value の内容が送信される.
– name は項目を区別するための名前.選択肢全体で共通の
名前を付ける. <p>
質問1 あなたの血液型は?<br>
<select name="q3“>
<option value="A">A型</option>
<option value="B">B型</option>
<option value="O">O型</option>
<option value="AB">AB型</option>
</select>
</p>
37
ファイルを扱ってみよう
 file1.txt がサーバーに存在する
<?php
print "1. output by fpassthru<br>\n";
$fh=fopen("file1.txt","r");
fpassthru($fh);
print "<br><br>\n";
print "2. output after input into array
and output the array.<br>\n";
$lines=file("file1.txt");
print_r ($lines);
?>
38
ファイルを扱ってみよう: Upload
http://bossp.is.kyushu-u.ac.jp/~oka/20090525/00/main.html
サーバー
メイン
<form enctype="multipart/form-data"
method="POST"
ACTION=“upload.php"><p>
<INPUT type="hidden"
name="MAX_FILE_SIZE"
SIZE=65536><p>
<INPUT type="file" name="testfile"
size=20><p>
<input type="submit" value="Upload">
<input type="reset" value="Clear">
<?php
printf("name1 %s<br>",
$_FILES['testfile']['name']);
printf("name2 %s<br><br>",$_FILES['test
file']['tmp_name']);
$filename=$_FILES['testfile']['tmp_name']
;
print "1. outout by fpassthru<br>\n";
$fh=fopen($filename,"r");
fpassthru($fh);
print "<br><br>\n";
print "2. output after input into array and
output the array.<br>\n";
$lines=file($filename);
print_r ($lines);
?>
39
練習問題
 手元のクライアントPC上で、英数字でテキストファイルを、
Windows XP のメモ帳などで作成し、それをサーバーにアップ
ロードして、
– そのテキスト、
– そのテストに含まれる単語数、
– そのテキストに含まれる文字数、
を、表示するプログラムを作成せよ。
例:
This is a pen. Is this a pen,too? Yes, it is.
– 単語数 12
– 文字数?
40
演習問題
 クライアントの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)
– 単語は出現頻度やアルファベット順にソーティングできると、なおよい。
41