26
Webプログラミングの基礎 PHPの基礎(6) ~POST 2011/06/22政策情報学部 渡辺恭人 [email protected] メーリングリスト:[email protected]資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/

PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

Webプログラミングの基礎PHPの基礎(6)~POST

(2011/06/22)

政策情報学部

渡辺恭人

[email protected]

メーリングリスト:[email protected]

資料ページ: http://www.cuc.ac.jp/~riho-m/rg11/

Page 2: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

入力された文字を受け取りPOSTで送信する部分(post.htm)

2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html lang="ja">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>フォームデータの取得</title>

</head>

<body>

<form method="POST" action="post.php">

名前:<input type="text" name="nam" size="15" />

<input type="submit" value="送信" />

</form>

</body>

</html>

Page 3: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

入力された文字を受け取りPOSTで送信する部分(post.htm)

• 入力された文字を受け取る部分(HTML)

– nam

• テキストボックス(<input>タグ)のnameオプションで指定された要素名

• 表示する部分(PHPで記述)

– HTMLフォーム(<form method=“POST”>)で入力された文字をPHPで取得するには、 $_POST[ ’要素名 ’ ]とする

– この$_POSTがスーパーグローバル変数

• オプションがGETなら、$_GETで取得3

Page 4: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

post.htmから送信されたデータを受け取り表示する部分(post.php)

4

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html lang="ja">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>フォームデータの取得</title>

</head>

<body>

こんにちは、<?php print($_POST['nam']); ?>さん!

</body>

</html>

Page 5: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

フォームデータの取得(複数値)

• チェックボックスを使う場合

–好きな食べ物をクリックでチェックさせ選択させる(複数回答可)

–送信後、どれを選んだかを表示

• 入力して送信する部分

• 入力されたデータを受け取り表示する部分

5

Page 6: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

入力して送信する部分(post2.htm)

6

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>フォームデータの取得(複数値対応)</title>

</head>

<body>

<form method="POST" action="post2.php">

好きな食べ物は?:<input type="checkbox" name="food[ ]" value="りんご" />りんご<input type="checkbox" name="food[ ]" value="みかん" />みかん<input type="checkbox" name="food[ ]" value="メロン" />メロン<input type="submit" value="送信" />

</form>

</body>

</html>

Page 7: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

入力されたデータを受け取り表示する部分(post2.php)

7

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>フォームデータの取得(複数値対応)</title>

</head>

<body>

あなたが好きな食べ物は、<?php print(join($_POST["food"],"と")); ?>

ですね。</body>

</html>

Page 8: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

フォームデータの取得(複数値)

• 一つの要素が複数の値を持つ場合

– <input type=“checkbox” name=“food[]” ….

– [] によって、要素が複数の値を持つことをPHP側が認識できる

• joinという関数で配列の要素を「と」で連結する

– 1番目の値のみを取得したい場合は、

• $_POST[”food”][0]と書く

8

Page 9: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

ファイルの構成

• 2ファイル構成

– フォームで入力したデータをPOSTで送信するHTML

–そのHTMLからPOSTで送信されたデータを受信するPHP

• 1ファイルでもできる

–動作に注意

–自分自身を呼び出すときは、

<form method="POST">のように、action=は書かない。

9

Page 10: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

おみくじプログラム(前半: omikuji.php)

10

<?php

if (isset($_POST["start"])) {

$uranai_data[] = "大吉です。";

$uranai_data[] = "中吉です。";

$uranai_data[] = "吉です。";

$uranai_data[] = "末吉です。";

$uranai_data[] = "凶です。";

$max = count($uranai_data) - 1;

$result = rand(0, $max);

$message = "あなたの運勢は・・・" . $uranai_data[$result];

} else {

$message = "あなたの運勢をチェックしましょう。";

}

?>

Page 11: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

おみくじプログラム(後半: omikuji.php)

11

<html>

<head>

<title>おみくじプログラム</title>

</head>

<body>

<h2>今日のおみくじ</h2>

<h4>「おみくじを引く」ボタンをクリックすると結果が表示されるよ。</h4>

<form method="post">

<textarea name="result" rows="5" cols="40"><?php print $message;?></textarea>

<br>

<input type="submit" name="start" value="おみくじを引く">

</form>

</body>

</html>

Page 12: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

おみくじプログラム(解説)

• プログラムは上から順に実行される

• PHPの部分はフォームで入力したデータを受け取る部分⇒先に実行されると困る

• したがって、フォームで入力したデータを受け取ってないかどうかを判断する必要がある。

• Isset関数でPOST変数に変数がセットされているかどうかをチェック

12

if (isset($_POST["start"])) {

Page 13: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

おみくじプログラム(解説)

• おみくじの結果が格納された配列の個数を取得

– 0から順に割り振られる

–配列の最大番号は、個数-1になる

– これを$maxに代入

• rand関数で「0から最大数$max」までの値(0~4)から一つをランダムで選択し、その値を$result変数に格納する 13

$max = count($uranai_data) - 1;

$result = rand(0, $max);

Page 14: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

おみくじプログラム(解説)

• ランダムで選ばれた値をおみくじ結果の配列から取得して、message変数にメッセージを格納する

14

$message = "あなたの運勢は・・・" . $uranai_data[$result];

Page 15: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

課題

• おみくじのプログラムを参考にして、生まれた年(西暦)を入力すると、干支を表示するプログラムを作ってください。

• 以上、作ったプログラムと実行結果をWordにまとめ、メーリングリストに提出してください。

• ファイル名 例: kadai-0622-学籍番号.doc

• 締切: 6/28 23:59

15

Page 16: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

日本の干支(十二支)

16

0 子 ね 鼠

1 丑 うし 牛

2 寅 とら 虎

3 卯 う 兎

4 辰 たつ 竜

5 巳 み 蛇

6 午 うま 馬

7 未 ひつじ 羊

8 申 さる 猿

9 酉 とり 鶏

10 戌 いぬ 犬

11 亥 い 猪

Page 17: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

ヒント

• 干支のデータは配列変数に順に代入して管理する。

–例、eto_data[0]=”ねずみ”

• 入力した西暦がどの干支かを判断するところがポイント

–例、eto_data[0]の「ねずみ」年は2008年なので、年に足すか引くかして12で割った余りが0になるようにする。

– 2008から4を引いた2004を12で割ると余りが0になるので、これを計算式にする(%を使う)

17

Page 18: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

ヘッダー情報の取得

• サーバにアクセスしたクライアントの種類、対応言語、リンク元のURLなどを表示する

– http://www.studyinghttp.net/headerを参照

• $_POSTと似た変数の$_SERVERを使う

–スーパーグローバル変数という

• 書式

– $_SERVER[”ヘッダー名”]

18

Page 19: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

ヘッダー情報の取得(head.htm)

19

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>ヘッダ情報の取得</title>

</head>

<body>

<a href="head.php">ここをクリック</a>

</body>

</html>

Page 20: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

ヘッダー情報の取得(head.php)

20

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>ヘッダ情報の取得</title>

</head>

<body>

User-Agent ->

<?php print($_SERVER["HTTP_USER_AGENT"]); ?><br />

Accept-Language ->

<?php print($_SERVER["HTTP_ACCEPT_LANGUAGE"]); ?><br />

Referer ->

<?php print($_SERVER["HTTP_REFERER"]); ?><br />

</body>

</html>

Page 21: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

文字化けについて

• Webアプリケーションでよく起きるトラブル

–データの入出力・メール送信などの個所で起きる

– Webブラウザ、Webサーバ、PHP、データベースサ

ーバなどの間で文字コードが正しく設定されていないときに起こりうる

• 文字化けの原因

–文字にはコードが多数ある(日本語にも数種類)

• 使う文字コードを統一するのも一つの方法

– PHPでどのように設定されているかを確認する

• Phpinfo()の表示のうち、mbstringカテゴリ21

Page 22: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

文字コード

• JIS(ISO-2022JP)

– 電子メールでの日本語の文字コード

• SJIS(Shift JIS)

– WindowsやMS-DOS等で

普及した日本語の文字コード

• EUC( Extended UNIX Code)

– UNIXシステムで普及

• UTF-8

– コンピュータ上で多言語の文字を単一の文字コードで取り扱うために1980年代に提唱された

文字コードであるUnicodeの一つ

22

Page 23: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

PHPでの設定方法

• 3つ

– php.iniを設定

• 一般ユーザにはできない

– .htaccessを設定

• 使えないレンタルサーバもある

– PHPのスクリプト内で設定

23

Page 24: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

PHPスクリプトの中で設定する

24

<?php

mb_internal_encoding ("UTF-8");

mb_http_output("UTF-8");

ob_start("mb_output_handler");

header("Content-Type: text/html; charset=UTF-8");

print "日本語を出力する";

?>

EmEditorで保存するときに、文字コードをUTF-8に設定するのを忘れないように!(設定した文字コードと同じにする。)

Page 25: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

.htaccessファイルで設定する

• .htaccessファイル

– WebサーバのApacheの設定やPHPの設定、ユーザの認証を設定する

– Windowsでは、ドット「.」で始まるファイル名はつく

れないので、ドットのないファイル名で作成し、www2に転送してから変更する

• 次の1行をhtaccessというファイル名で作成する

– WinSCPで転送して、ファイル名を .htaccessに変更25

php_value default_charset UTF-8

Page 26: PHPの基礎(6)~POST 2011/06/22riho-m/rg11/files/20110622_php06.pdf2011/06/22  · •PHPの部分はフォームで入力したデータを受 け取る部分⇒先に実行されると困る

文字コードの確認

• 以下のプログラムを入力・保存し、WinSCPでwww2に転送してください

• Internet Explorerで実行する

• default_charsetの欄を見る

26

<?php

phpinfo();

?>