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