php プログラムの実行

41
1 PHP ププププププププ ププ ププププ プププ ププ 21 ププ ププププ III ププププププププ プププ (2) ププププ プププ プププププププ プププププププププププ 一、、 ププププププププププププププププhttp://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/

Upload: rhea

Post on 15-Jan-2016

45 views

Category:

Documents


0 download

DESCRIPTION

平成 21 年度 情報科学 III (理系コア科目・2年生). PHP プログラムの実行. 担当 岡村耕二 月曜日 2限. http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/. 本資料の一部は、堀良彰准教授、天野浩文准教授等による 以前の講義資料をもとにしています。. 演習の回答例. a, b, c を入力して、 2 次方程式を解くプログラムを作成せよ。 aX^2 + bX = C 名前、数字を5名分入力し、数字の順に並び替えるプログラムを作成せよ。 入力画面および入力例 出力例 大橋 29 馬出 22 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PHP  プログラムの実行

1

PHP プログラムの実行

担当 岡村耕二月曜日 2限

平成 21 年度 情報科学 III (理系コア科目・2年生)

本資料の一部は、堀良彰准教授、天野浩文准教授等による以前の講義資料をもとにしています。

http://okaweb.ec.kyushu-u.ac.jp/lectures/jk3/

Page 2: PHP  プログラムの実行

2

演習の回答例• a, b, c を入力して、 2 次方程式を解くプロ

グラムを作成せよ。– aX^2 + bX = C

• 名前、数字を5名分入力し、数字の順に並び替えるプログラムを作成せよ。– 入力画面および入力例

– 出力例• 大橋 29• 馬出 22• 箱崎 12• 六本松 9• 伊都 4

箱崎 12

六本松 9

馬出 22

伊都 4

大橋 29

Page 3: PHP  プログラムの実行

3

演習 1: http://bossp.is.kyushu-u.ac.jp/~oka/20090518/10/main.html演習 1: http://bossp.is.kyushu-u.ac.jp/~oka/20090518/10/main.html

メイン

<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>

式を解く

$a=$_POST["a"];$b=$_POST["b"];$c=$_POST["c"];

printf("a=%d,b=%d,c=%d <p>\n",$a,$b,$c);

$c = $c * -1;$d = $b * $b - 4 * $a * $c;

printf("D=%d <p>\n",$d);

printf("<HR>");

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) );

}elseif ($d==0) {

printf(" x = %d/%d. <br>\n",($b * -1),2 * $a); printf("or x = %.3f.", ($b * -1)/(2 * $a));

}elseif ($d <0){

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) );}

Page 4: PHP  プログラムの実行

4

演習 2: http://bossp.is.kyushu-u.ac.jp/~oka/20080518/11/main.html演習 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["name2"],$_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]);

Page 5: PHP  プログラムの実行

5

前回のおさらい(1)前回のおさらい(1)

配列( array )– 複数の値をリストとしてまとめて格納する.

• ひとつひとつの値を要素( element )と呼ぶ.– 番号で要素を特定するものと,名前で要素を特定する

ものがある.

多次元の配列も作れる.

$fruit[1] = "banana"; // 番号で要素を識別する配列の例$fruit[0] = "apple";$fruit[2] = " みかん "; $profile["sex"] = " 男 "; // 名前で要素を識別する配列(連想配列)の例$profile["age"] = 20;$profile["country"] = "Japan";

Page 6: PHP  プログラムの実行

6

配列を模式的に書くと配列を模式的に書くと

番号で要素を区別する配列の場合

連想配列の場合

$fruit[0] $fruit[2]$fruit[1]

必要に応じて伸びていく

"apple"

"banana" " みかん "

$profile["sex"] $profile["country"]

$profile["age"]

必要に応じて伸びていく

" 男 "

20 "Japan"

実は,並んでいる順番はあまり重要でない.

Page 7: PHP  プログラムの実行

7

前回のおさらい(2)前回のおさらい(2)

関数( function )– ( )で囲まれたデータ(引数)を受け取り,何かの

処理をして,結果を返す.– 「引数」は「ひきすう」と読む.

ほとんどの場合,実行結果は,変数に直接代入できる.– 実行結果として返される値は,「戻り値」と呼ばれる.– 戻り値がのちのち必要になる場合は,いったん変数で

受け取っておいて,その変数を利用するとよい.

戻り値を受け取る変数 = 関数名 ( 引数 );戻り値を受け取る変数 = 関数名 ( 引数 );

Page 8: PHP  プログラムの実行

8

前回のおさらい(3)前回のおさらい(3)

PHP プログラムがうまく実行されないときのチェックリスト– HTML の開始タグ・終了タグはきちんと対応が取れている

か?•例: <head> ~ </head>

– PHP の開始タグ・終了タグはきちんと対応が取れているか?•<?php ~ ?>

– ( ~ ), { ~ }, " ~ ",などの対応は取れているか?

– あるべきところにセミコロンがあるか?– 連想配列に値をセットするとき/値を読むとき,キーの名

前を打ち間違えていないか?• 例:  $message["Wed"] と $message["Wen"];

Page 9: PHP  プログラムの実行

9

print( ) に関する補足と訂正print( ) に関する補足と訂正

第 4 回のスライドでは,以下のように説明していた.– print( ) は関数である.– print( ) は論理型の値を返す.

正しくは,以下の通りであった.http://www.php.net/manual/ja/function.print.php(関数レファレンスの中に書かれてはいるけれど…)– 厳密に言うと,実は print( ) は関数ではなく PHP

言語が持つ特殊な構文構造であり,括弧を省略することもできる.

– print または print( ) を実行した結果の値(戻り値)は,常に1である.

Page 10: PHP  プログラムの実行

10

今日勉強すること今日勉強すること

PHP の実行形態PHP と入出力(おさらい)PHP とファイル処理

Page 11: PHP  プログラムの実行

11

PHP の実行形態PHP の実行形態

Page 12: PHP  プログラムの実行

12

PHP はプログラミング言語であるPHP はプログラミング言語である

ここまでの講義では, HTML 文書に埋め込むような使い方だけを扱ってきたが:– 実は, PHP のみでプログラムを書き, webサーバ抜

きで実行することもできる.bossp のように, PHP 処理系がコマンドラインからでも

実行できるようにインストールされているサーバでは,以下のような形式でも実行できる.

– web ブラウザでアクセスしたときに何の表示も出ないようなときには,これによって何がおかしいのかを知ることができるかも知れない.

[te999999@bossp ~]$ php PHPのファイル名

Page 13: PHP  プログラムの実行

13

PHP プログラムをコマンドラインから実行すると…PHP プログラムをコマンドラインから実行すると…ミニ実習

– これまでに作った PHP プログラムをコマンドラインから実行してみよう

• Tera Term ( TTSSH ) で bossp に接続して, PHPプログラムの入っているディレクトリ( ~/public_html )まで cd して実行

何がおきるか?

[te999999@bossp ~]$ cd public_html[te999999@bossp ~]$ php PHPのファイル名

Page 14: PHP  プログラムの実行

14

PHP プログラムの実行形態(まとめ)PHP プログラムの実行形態(まとめ)

1. PHP 処理モジュールがインストールされている web サーバ上で, web サーバ経由で実行させる.

• PHP プログラムを実行した結果が, HTML データに埋め込まれて,ブラウザに返される.

2. PHP がコマンドラインで実行できるようにインストールされているサーバ上で,コマンドラインから起動する.

• PHP プログラムを実行した結果が,ディスプレイ上に表示される.

• 実際には:– HTTP レスポンスの一部も合わせて出力される.–純粋の PHPだけでなく, HTML埋め込みの PHP も

処理できる.

Page 15: PHP  プログラムの実行

15

PHP と入出力PHP と入出力

Page 16: PHP  プログラムの実行

16

プログラムにとっての入出力(1)プログラムにとっての入出力(1)

プログラムを実行するときには,普通は,外部から与えたデータを元に計算をさせたり,計算した結果を後に(外に)残したりしたいことが多い.– 実行時に外部から何のデータも持ってこない(あるい

は,外部の影響をまったく受けない)プログラムがあったとしたら:

• 何度実行しても同じ実行結果しか生み出せない.• 2回以上実行する意味がどれだけあるか?

– 実行時に得られた計算結果を外部に引き渡さない(あるいは,外部に何の影響も残さない)プログラムがあったとしたら:

• 何を計算してもその結果を知る方法がない.• そもそも,実行する意味があるか?

Page 17: PHP  プログラムの実行

17

プログラムにとっての入出力(2)プログラムにとっての入出力(2)

入力( input )– プログラムに対して,外部から与えられるデータ– 入力の例

• Enter キーが押されるまでの間にキーボードから打ち込まれた文字列

• ファイルの中に格納されていた文字列や数値出力( output )

– プログラムが,外部に対して与える(残す)データ– 出力の例

• ディスプレイの画面に表示される文字列• ファイルの中に保存される文字列や数値

Page 18: PHP  プログラムの実行

18

プログラムにとっての入出力(3)プログラムにとっての入出力(3)

通常のプログラムの典型的な実行形態– 入力はキーボードから– 出力はディスプレイに

実行中のプログラム

Page 19: PHP  プログラムの実行

19

プログラムにとっての入出力(4)プログラムにとっての入出力(4)

場合によっては,入力や出力をファイルに対して行うこともある.

実行中のプログラム

Page 20: PHP  プログラムの実行

20

標準入出力標準入出力

多くのオペレーティングシステムでは,実行開始されたプログラムに,以下の3種類の入力・出力をあらかじめ与えている.– 標準入力( standard input )

• デフォルトでは,キーボードから– 標準出力( standard output )

• デフォルトでは,ディスプレイに– 標準エラー出力( standard error output )

• デフォルトでは,ディスプレイに出力が2つに分かれているのは…

– 正常に処理できたときのメッセージ等と,何か問題が起きたときのメッセージ等を分離して保存しやすくするため.

Page 21: PHP  プログラムの実行

21

コマンドラインから実行される PHP プログラムコマンドラインから実行される PHP プログラム

標準出力・標準エラー出力をディスプレイに出せる.キーボードからの標準入力を受けることもできる.ファイルに対する入出力もできる.

実行中のPHP プログラ

ただし,適切な関数を呼び出す必要がある.

インターネット

TTSSH

SSH が提供する「回廊」

Page 22: PHP  プログラムの実行

22

webサーバ経由で実行される PHP プログラム(1)webサーバ経由で実行される PHP プログラム(1)サーバ上のファイルに対する入出力

– これもあまり問題はない.– 実際,このような機能を提供するための関数もいろい

ろと用意されている.

webサーバ

PHP処理

モジュール

実行中のPHP プログ

ラム

インターネット

サーバ

Page 23: PHP  プログラムの実行

23

webサーバ経由で実行される PHP プログラム(2)webサーバ経由で実行される PHP プログラム(2)クライアントに対する入出力?

– ところが, webサーバ上で実行中の PHP プログラムからは,クライアントのキーボードやディスプレイが直接には見えない.

– 「標準入出力」の考えは,この実行形態にあまりなじまない.

webサーバ

PHP処理

モジュール

実行中のPHP プログ

ラム

インターネットクライアント ?

Page 24: PHP  プログラムの実行

24

ではどうやって入出力するか?ではどうやって入出力するか?

しかたがないので, HTTP の力を借りる.– 入力は, HTTP リクエストから受け取る.– 出力は, HTTP レスポンスに埋め込む.

webサーバ

PHP処理

モジュール

実行中のPHP プログ

ラム

インターネットクライアント HTTP

レスポンス

HTTPリクエス

Page 25: PHP  プログラムの実行

25

クライアントへの間接的な出力クライアントへの間接的な出力

これは, print( ) の呼び出しで簡単に実現できる.– ステータス行やメッセージヘッダは自動的に付加され

る.

<html>

<head>

...

</head>

<body>

Hello, World!

</body>  </html>

<html>

<head>

...

</head>

<body>

<?php

print("Hello, World!\n");

?>

</body>  </html>

ステータス行

メッセージヘッダ(ない場合もある)

(空行)

PHP プログラムHTTP レスポンス

Page 26: PHP  プログラムの実行

26

クライアントからの間接的な入力クライアントからの間接的な入力

HTML の <form> タグを用いる.– ブラウザ画面内で入力された内容を集める.

• 入力させる内容は <input> タグで指定する.– submit タイプのボタンがクリックされると,集めた内容を HTTP で送信する.

– reset タイプのボタンがクリックされると,ブラウザに入力された内容をクリアする.

<form method=" メソッド名 " action="URL"> <input ... > ... <input type="submit" value="送信 "> <input type="reset" value=" クリア "></form>

Page 27: PHP  プログラムの実行

27

<form> タグ(1)<form> タグ(1) <form> タグの詳細

– method :ブラウザに入力されたデータの送信形式( GET または POST )• GET :データを URL の末尾に追加して送信する.送信できる

データ量には制限がある. • POST :データを URL とは別に送信する形式.一度に大量のデー

タを送信することもできる. – action :集めたデータの送信先の URL

• 通常は, PHP プログラム( HTML埋め込みも可)または CGI プログラム

• このファイルと同じディレクトリにあるときには,ファイル名だけでも可.

<form method=" メソッド名 " action="URL" ...> ...</form>

Page 28: PHP  プログラムの実行

28

<form> タグ(2)<form> タグ(2)

<form> タグによるデータ受け渡しの様子– <form> タグを含む webページを表示中に, submit

タイプのボタンをクリック– 入力されていた内容が, action 先のプログラムに渡

される.

webサーバ

PHP処理

モジュール

クライアント

HTTPリクエス

Page 29: PHP  プログラムの実行

29

<form> タグ(3)<form> タグ(3)

<form> タグは, PHPだけでなく, CGI プログラムに対するデータ入力の方法としても用いられる.

CGI ( Common Gateway Interface )– webサーバに, webブラウザからの要求に応じてプロ

グラムを起動させるためのしくみ– よく用いられるのは Perl で書かれたスクリプト

入力データを集める最初の web ページは, HTMLだけで書いてもよいし, CGI プログラムや PHP ( HTML埋め込みを含む)を使って書いてもよい.

ファイルをアップロードするようなときは, method , action の他に enctype 属性も指定する必要がある.

Page 30: PHP  プログラムの実行

30

<input> タグのいろいろ(1)<input> タグのいろいろ(1)

<input type="text" name=" 名前 "...>

– 1行のテキストの入力欄を作る.– name は項目を区別するための名前.項目ごとに違う

名前を指定する.– size , maxlength 属性の指定ができる.– value を指定すると,あらかじめ文字列を入れてお

くことができる.

<p> 簡単なテキスト入力欄の例 <input type="text" name="text1"> </p>

Page 31: PHP  プログラムの実行

31

<input> タグのいろいろ(2)<input> タグのいろいろ(2)

<input type="password" name=" 名前 " ...>

– パスワード形式の入力欄を作る.ここに入力される内容は画面上ではすべてアスタリスク( * )となる.

– name は項目を区別するための名前.項目ごとに違う名前を指定する.

– size , maxlength 属性の指定ができる.– value を指定すると,あらかじめ文字列を入れてお

くことができる.ただし,これもすべてアスタリスク( * )となる.<p>簡単なパスワード入力欄<input type="password" name="password1"></p>

Page 32: PHP  プログラムの実行

32

<input> タグのいろいろ(3)<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>

Page 33: PHP  プログラムの実行

33

<input> タグのいろいろ(4)<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>

Page 34: PHP  プログラムの実行

34

<input> タグのいろいろ(5)<input> タグのいろいろ(5)

<input type="file" name=" 名前 " ...>

– ファイルの送信欄を作る.自動的に「参照 ... 」または「 Browse... 」ボタンが表示される.

– name は項目を区別するための名前.項目ごとに違う名前を指定する.

– size を指定すると,入力欄の横幅を決められる.<p>送信するファイル:<br><input type="file" name="uploadfile1"></p>

Page 35: PHP  プログラムの実行

35

<input> タグのいろいろ(6)<input> タグのいろいろ(6)

<input type="hidden" name=" 名前 " ...>

– ブラウザ画面には表示されない「隠しデータ」を送信する.

– name は項目を区別するための名前.項目ごとに違う名前を指定する.

<p><input type="hidden" name="title" value="非表示データ "> </p>

Page 36: PHP  プログラムの実行

36

その他のタグ(1)その他のタグ(1)

<textarea name=" 名前 " ...> </textarea>– 複数行のテキスト入力欄を作る.– name は項目を区別するための名前.項目ごとに違う

名前を指定する.– cols , rows で入力欄の横幅,高さを決められ

る. wrap で自動改行のタイプを指定できる.– このタグで囲まれた部分に文字列を入れておくと,あ

らかじめその文字列が入力された状態になる.

<p>テキストエリアの例:<br><textarea name="message1"> ここを編集 </textarea> </p>

Page 37: PHP  プログラムの実行

37

その他のタグ(2)その他のタグ(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>

Page 38: PHP  プログラムの実行

38

ファイルを扱ってみようファイルを扱ってみよう

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);

?>

Page 39: PHP  プログラムの実行

39

ファイルを扱ってみよう : Uploadhttp://bossp.is.kyushu-u.ac.jp/~oka/20090525/00/main.html

ファイルを扱ってみよう : Uploadhttp://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">

サーバー

<?phpprintf("name1 %s<br>",

$_FILES['testfile']['name']);printf("name2 %s<br><br>",

$_FILES['testfile']['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);?>

Page 40: PHP  プログラムの実行

40

練習問題練習問題

手元のクライアント PC上で、英数字でテキストファイルを、 Windows XP のメモ帳などで作成し、それをサーバーにアップロードして、– そのテキスト、– そのテストに含まれる単語数、– そのテキストに含まれる文字数、

を、表示するプログラムを作成せよ。

例 :

This is a pen. Is this a pen,too? Yes, it is.

– 単語数 12

– 文字数?

Page 41: PHP  プログラムの実行

41

演習問題演習問題

クライアントの 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)

– 単語は出現頻度やアルファベット順にソーティングできると、なおよい。