PHP入門 リクエスト情報 ポストデータ($_POST)
ポストデータとは、<from method=”POST”>タグで定義されたHTMLフォームから送信されるデータの事です。テキストボックスやラジオボタン、選択ボックスなど、おなじみのフォーム要素から入力された情報は、サブミットボタンをクリックすることでサーバーに送信されます。
ポストデータを取得する
クライアントから送信されたポストデータを取得するのは、$_POSTの役割です。$_POSTの正体は「要素名=>値」の連想配列なので、個々の要素値にアクセスするには$_POST[‘要素名’]のように表します。次の例では、テキストボックスの名前が「name(name属性)」なので、$_POST[‘name’]で値を取得できます。
post1.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>PHPサンプル</title>
</head>
<body>
<form method="POST" action="post2.php">
<label for="name">名前:</label>
<input id="name" type="text" name="name" size="15" />
<input type="submit" value="送信">
</form>
</body>
</html>
post2.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>ポストデータ</title>
</head>
<body>
こんにちは、<?=$_POST['name'] ?>さん
</body>
</html>
エスケープ処理
ユーザーから入力された値やデータベース/外部サービスなどから取得した値を表示するには、HTMLエスケープと呼ばれる処理が必要です。HTMLエスケープとは、文字に含まれる「<」や「>」「&」「”」など、HTMLにおいて特殊な意味を持つ文字を、それぞれ「<」「>」「&」「"」のような文字列に置き換える処理のことです。エスケープ処理を正しく行わなかった場合、クロスサイトスクリプティング(XSS)と呼ばれる貧弱性の原因になります。
Encode.php
<?php
function e(string $str, string $charset = 'UTF-8'): string{
return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, $charset, false);
}
?>
post2.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>ポストデータ</title>
</head>
<body>
<?php require_once './Encode.php';?>
こんにちは、<?=e($_POST['name']) ?>さん
</body>
</html>
構文:htmlspecialchars関数
htmlspecialchars(string $string [, int $flags = ENT_COMPAT
[, ?string $encoding [, bool $double_encode = true ]]]) : string
$string | エスケープ対象の文字列 |
$flags | エスケープの種類 |
$encoding | 使用する文字エンコーディング(既定はdefault_charsetパラメーターの値) |
$double_encode | HTMLエンティティ(&xx;)を二重にエスケープするか |
エスケープの種類(引数$flagsの設定値)
分類 | 設定値 | 概要 |
---|---|---|
クォート | ENT_COMPAT | ダブルクォートは変換するが、シングルクォートは変換しない |
ENT_QUOTES | ダブルクォート/シングルクォート共に変換する | |
ENT_NOQUOTES | ダブルクォート/シングルクォート共に変換する | |
無効 | ENT_SUBSTITUTE | 無効なシーケンスを渡した場合、大害文字で置換(既定では空文字列に変換) |
ENT_DISALLOWED | 現在の文書型で無効なシーケンスを渡した場合、代替文字で置換 | |
ENT_IGNORE | 無効なシーケンスを渡した場合、切り捨て(非推奨) | |
文書型 | ENT_HTML401 | HTML4.01として処理 |
ENT_XML1 | XML1.0として処理 | |
ENT_XHTML | XHTMLとして処理 | |
ENT_HTML5 | HTML5として処理 |
既定のENT_COMPATは下位互換のための設定値で、エスケープの方法としては不完全です。原則として、引数$flagsには「ENT_QUOTES | ENT_HTML5」を指定します。
引数$encodeingには、使用している文字エンコーディングを指定します。default_charsetパラメーターで指定している文字コードを指定します。(UTF-8)
引数$double_encodeは、文字列を二重にエスケープした場合の挙動を決めます。例えば「Tom&Jerry」であれば、以下のように変化します。
Tom & Jerry 1度目
Tom & Jerry 2度目
1度目のエスケープで「&」と変換されたものが、さらに「&」の部分だけ処理されて「&:amp;」になってしまうので、「false(二重エスケープは無効)」にします。
複数の値を持つ要素にアクセスする
フォーム要素によっては、1つの要素で複数の値を持つものがあります。具体的には、チェックボックスや複数選択が可能なリストボックス(multipleオプションが有効なリストボックス)があります。そのような場合は、フォーム側に「複数の値があること」を明示します。要素名の末尾にブラケット([])を付けます。これによって、指定された要素の値が配列としてPHPに渡されることになります。implode関数は配列の内容を連結する関数です。配列の内容をカンマで連結して出力しています。
post1.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>PHPサンプル</title>
</head>
<body>
<form method="POST" action="post2.php">
あなたがよく使用する言語は?<br />
<input id="php" type="checkbox" name="lang[]" value="PHP" />
<label for="php">PHP</label>
<input id="java" type="checkbox" name="lang[]" value="Java" />
<label for="java">Java</label>
<input id="charp" type="checkbox" name="lang[]" value="C#" />
<label for="charp">C#</label>
<input type="submit" value="送信">
</form>
</body>
</html>
post2.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>ポストデータ</title>
</head>
<body>
<?php require_once './Encode.php';?>
選択されたのは、<?=e(implode(',',$_POST['lang'])) ?>です
</body>
</html>