平成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
© Copyright 2024 ExpyDoc