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>
実行結果
post1.phpにアクセス
実行結果
送信ボタンをクリック

エスケープ処理

ユーザーから入力された値やデータベース/外部サービスなどから取得した値を表示するには、HTMLエスケープと呼ばれる処理が必要です。HTMLエスケープとは、文字に含まれる「<」や「>」「&」「”」など、HTMLにおいて特殊な意味を持つ文字を、それぞれ「&lt;」「&gt;」「&amp;」「&quot;」のような文字列に置き換える処理のことです。エスケープ処理を正しく行わなかった場合、クロスサイトスクリプティング(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_encodeHTMLエンティティ(&xx;)を二重にエスケープするか

エスケープの種類(引数$flagsの設定値)

分類設定値概要
クォートENT_COMPATダブルクォートは変換するが、シングルクォートは変換しない
ENT_QUOTESダブルクォート/シングルクォート共に変換する
ENT_NOQUOTESダブルクォート/シングルクォート共に変換する
無効ENT_SUBSTITUTE無効なシーケンスを渡した場合、大害文字で置換(既定では空文字列に変換)
ENT_DISALLOWED現在の文書型で無効なシーケンスを渡した場合、代替文字で置換
ENT_IGNORE無効なシーケンスを渡した場合、切り捨て(非推奨)
文書型ENT_HTML401HTML4.01として処理
ENT_XML1XML1.0として処理
ENT_XHTMLXHTMLとして処理
ENT_HTML5HTML5として処理

既定のENT_COMPATは下位互換のための設定値で、エスケープの方法としては不完全です。原則として、引数$flagsには「ENT_QUOTES | ENT_HTML5」を指定します。

引数$encodeingには、使用している文字エンコーディングを指定します。default_charsetパラメーターで指定している文字コードを指定します。(UTF-8)

引数$double_encodeは、文字列を二重にエスケープした場合の挙動を決めます。例えば「Tom&Jerry」であれば、以下のように変化します。

Tom & Jerry         1度目
Tom &amp; Jerry     2度目

1度目のエスケープで「&amp;」と変換されたものが、さらに「&」の部分だけ処理されて「&amp: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>