Home > PHP Archive

PHP Archive

PHP: フォーム情報の送信・受信 - POSTメソッド

HTMLフォームの情報をPOSTメソッドで送信し、送信されたデータをPHPスクリプトで取得しHTMLに埋め込み表示してみます。フォームの各フィールドははformタグ中でinput、select、textareaタグ等を用いて指定します。特にinputタグは下表の様にtype属性が色々あります。

inputタイプ type属性
テキスト入力 type="text"
パスワード入力 type="password"
ラジオボタン type="radio"
チェックボックス type="checkbox"
送信ボタン type="submit"
ボタン type="buttun"

フォームデータの送信先はformタグのaction属性で指定します。また、そのときのリクエストメソッドの指定はformタグのmethod属性で指定し、ここではPOSTを用いるのでmethod="post"と記述します。POSTはGETメソッドと異なり特に文字制限はありません。

ソースコード

form_test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTMLフォーム情報の送信テスト</title>
</head>
<body>
<form action="show_form_data.php" method="post">
ID:<input type="text" name="user_id" /><br />
PASS:<input type="password" name="pass" /><br />
性別:<input type="radio" name="sex" value="1" checked />男性
<input type="radio" name="sex" value="2" />女性<br />
学年:<select name="grade">
<option value="1" selected>1年生</option>
<option value="2">2年生</option>
<option value="3">3年生</option>
<option value="4">4年生</option>
</select><br />
所有デジタル機器:
<input type="checkbox" name="have_dig[0]" value="1" />PC
<input type="checkbox" name="have_dig[1]" value="1" />Cell<br />
コメント:<br /><textarea name="comment" cols="30" rows="5"></textarea><br />
<input type="submit" value="送信" />
</form>
</body>
</html>

フォームデータは同ディレクトリに設置したshow_form_data.phpファイルに送信しています。

show_form_data.php

<?php
// 変数の初期化
$user_id = "";
$pass = "";
$sex = "1";
$grade = "1";
$have_dig = array("0", "0");
$comment = "";

// POSTリクエストがあった時
if ($_SERVER["REQUEST_METHOD"] == "POST") {
	$user_id = htmlspecialchars($_POST["user_id"], ENT_QUOTES);
	$pass = htmlspecialchars($_POST["pass"], ENT_QUOTES);
	$sex = $_POST["sex"];
	$grade = $_POST["grade"];
	if (isset($_POST["have_dig"])) {
		foreach($_POST["have_dig"] as $key => $value) {
			$have_dig[$key] = $value;
		}
	}
	$comment = htmlspecialchars($_POST["comment"], ENT_QUOTES);
} else {
	echo "フォームページからアクセスしてください。";
	exit(1);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTMLフォームのPOSTの受信テスト</title>
</head>
<body>
送信されたデータは、<br />
ID:<?=$user_id ?><br />
PASS:<?=$pass ?><br />
性別:<? echo $sex ? "男性" : "女性"; ?><br />
学年:<?=$grade ?>年生<br />
所有デジタル機器:
<?
if ($have_dig[0] == 1) echo "PC";
if ($have_dig[1] == 1) echo ($have_dig[0] == 1 ? "、" : "") . "Cell";
?><br />
コメント:<?=$comment ?><br />
</body>
</html>

POSTリクエストでshow_form_data.phpへアクセスした場合はexit関数でスクリプトを終了します(→PHP: exit - Manual)。

htmlspecialchars関数で特殊文字をエスケープします(→PHP: htmlspecialchars - Manual)。今回はPOSTメソッドに関する練習用スクリプトなのでバリデーション処理は入れていませんが、実際はセキュリティ対策と合わせて色々フィルタするなり、リダイレクトで別ページに誘導するなりの処理が必要です。最近はこの辺の処理をフレームワークで上手くラップしてくれるのでかなり楽になっています。

あと、余談ですがforeach文では操作対象の配列のコピーを作成して、コピーに対して処理していきます。

実行結果

form_test.html

HTMLフォームへの入力

show_form_data.php

POSTされたデータの出力

PHP: クライアントへのCookieの設定と削除 - setcookie()関数

クライアントのブラウザにCookieを保存・削除する手順の練習をしてみました。

Cookieはサーバからクライアントへレスポンスを送信する際にヘッダに含まれる情報で、Cookie受信以降のクライアントのリクエストにはCookieの情報が含まれます。これによって、クライアントの識別や状態を管理することが出来ます。

Cookieをクライアントに送信する際は有効期限を設定し、削除する際はその有効期限を過去のものとして期限オーバーを装い、ブラウザに削除させます。

具体的に以下の例では、setcookie(<cookie名>[, <値>[, <有効期限>[, <送信パス>[, <送信ドメイン>[, <httpsのときのみの送信?>]]]]])でCookieを設定、削除します。cookie名には変数の他に配列も使用することが出来ます。

ソースコード

Cookieを用いたクライアントへの情報の保存とアクセスのカウント例です。クライアントブラウザ側からのリクエストに含まれるCookieへのアクセスには配列$_COOKIEを用います。

<?php
$available_time = time() + 1800; // 有効期限: 30分
$expire = time() - 1800;
if (isSet($_COOKIE['login_info'])) { // Cookieがセットされているか?
	// クッキーを削除
	setcookie("login_info[user_id]", "", $expire);
	setcookie("login_info[user_name]", "", $expire);
} else {
	// クッキーを保存
	setcookie("login_info[user_id]", "59816", $available_time);// 現時刻から30分有効のCookie
	setcookie("login_info[user_name]", "yukun", $available_time);
}
// アクセスのカウント
if (isSet($_COOKIE['count'])) {
	$count = $_COOKIE['count'];
	$count++;
} else {
	$count = 1;
}
setCookie('count', $count, $available_time);
?>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>クッキーの利用と削除</title>
</head>
<body>
<?php
if (isSet($_COOKIE['login_info'])) {
	echo "ユーザ情報のクッキーがセットされています。<br />\n";
	//echo $_COOKIE['login_info']['user_name'];などでアクセスしてもよい
	foreach ($_COOKIE['login_info'] as $key => $value) {
		echo $key . " → " . $value . " <br />\n";
	}
} else {
	echo "ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。<br />\n";
}
echo $count . "回目のアクセスです。<br />\n";
?>
</body>
</html>

実行結果

1回目のアクセス

ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。
1回目のアクセスです。

2回目以降のアクセス(偶数回)

ユーザ情報のクッキーがセットされています。
user_id → 59816
user_name → yukun
2回目のアクセスです。

3回目以降のアクセス(奇数回)

ユーザ情報のクッキーが保存されていません(初回読み込み時) or 削除されました)。
3回目のアクセスです。

このときのCookieの保持状況をブラウザで確認してみると、
ブラウザFirefoxでCookieを確認

ちゃっかりというかしっかり保存されていますね。次のアクセスの際、これを読み込み以下の項目を表示しますが、

user_id → 59816
user_name → yukun

直後に削除されます。

Cookieはクライアントを識別するのに便利な機能ですが、これは改ざんされる恐れもありセキュリティに注意して扱わなければなりません。なので、上の例のような分かりやすい配列名で重要なデータ(例えばパスワードなども)を扱うのも好ましくないようです。

クッキーを扱う際の注意点

  • ブラウザの設定によってはCookieをうけつけない。
  • 1つのCookieのサイズは最大4KBまで
  • 1つのドメインでは最大20個まで
  • Cookieの有効期限の判定はクライアントの時計に従う

Home > PHP Archive

バックナンバー
最近のコメント
最近のトラックバック
メタ情報

Return to page top