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