フォームから値を取得する「$_POST」の使い方を見ていきます。
前回「フォームやURLのパラメータから値を取得する$_GETの使い方」の記事で$_GETの使い方を取り上げましたが、$_GETと同じように$_POSTもフォームから送られてきた値を取得することができます。
HTMLのフォーム
下記のようなシンプルなフォームを作成します。
<form action="" method="post"> <p><input type="text" name="first_name"></p> <p><input type="text" name="last_name"></p> <p><input type="submit" value="送信"></p> </form>
「action」は前回と同じく空にして送信先を自分自身にしています。
「method」を post とすることで送信先のファイルで $_POST を使用して値を受け取ることができます。
$_POSTで受け取る
送信された値は$_POSTに配列で入ってきます。キーはinputのname属性の値です。
下記のように表示することができます。(下記のままではセキュリティ的に良くないので気をつけて下さい)
<?php echo $_POST["first_name"]; echo $_POST["last_name"]; ?>
$_GETとは違い、URLにパラメータが表示されません。URLに表示されると良くない値、例えばパスワード等を送信する場合は必ずPOSTで送信しましょう。
簡単な例
動作確認用に、下記のような例を作成してみました。
<?php
$firstName = "";
$lastName = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!empty($_POST["first_name"]) && !empty($_POST["last_name"])) {
$fullName = $_POST["last_name"] . " " . $_POST["first_name"];
} else {
$lastName = $_POST["last_name"];
$firstName = $_POST["first_name"];
$err = "入力されていない項目があります。";
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>サンプル</title>
<meta name="robots" content="noindex, nofollow" />
</head>
<body>
<?php if (!isset($fullName)) : ?>
<form action="" method="post">
<p>姓: <input type="text" name="last_name" value="<?php echo htmlspecialchars($lastName, ENT_QUOTES, "UTF-8"); ?>"></p>
<p>名: <input type="text" name="first_name" value="<?php echo htmlspecialchars($firstName, ENT_QUOTES, "UTF-8"); ?>"></p>
<p style="color:red;"><?php echo $err; ?></p>
<p><input type="submit" value="送信"></p>
</form>
<?php else : ?>
<p>
あなたの名前は <?php echo htmlspecialchars($fullName, ENT_QUOTES, "UTF-8"); ?> ですね。<br>
</p>
<p><a href="">戻る</a></p>
<?php endif; ?>
</body>
</html>
内容を簡単に説明すると…
$firstName = ""; $lastName = "";
↑ 変数を初期化します。
if ($_SERVER["REQUEST_METHOD"] === "POST") {
↑ フォームがPOSTで送信された場合に{}内の処理を行うというif文です。
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!empty($_POST["first_name"]) && !empty($_POST["last_name"])) {
$fullName = $_POST["last_name"] . " " . $_POST["first_name"];
} else {
$lastName = $_POST["last_name"];
$firstName = $_POST["first_name"];
$err = "入力されていない項目があります。";
}
}
↑ 姓と名が両方入力されている場合は変数fullNameに値を入れます。両方または片方が空の場合はそれぞれの変数に値を入れ(入力された値をinputに表示するため)、エラーメッセージを作成します。
<?php if (!isset($fullName)) : ?>
<form action="" method="post">
<p>姓: <input type="text" name="last_name" value="<?php echo htmlspecialchars($lastName, ENT_QUOTES, "UTF-8"); ?>"></p>
<p>名: <input type="text" name="first_name" value="<?php echo htmlspecialchars($firstName, ENT_QUOTES, "UTF-8"); ?>"></p>
<p style="color:red;"><?php echo $err; ?></p>
<p><input type="submit" value="送信"></p>
</form>
<?php else : ?>
↑ 変数fullNameが存在しない(POSTが送信されていない または エラーが存在する)場合、フォームを表示し、エラーが存在する場合はメッセージを表示します。
htmlspecialchars という関数が初めて出てきました。これはフォームから送信された値をそのまま表示してしまうとセキュリティ的にまずいため、値をエスケープする関数です。htmlspecialcharsについては「エスケープ処理のためのhtmlspecialcharsの使い方」の記事をご覧ください。
<?php else : ?>
<p>
あなたの名前は <?php echo htmlspecialchars($fullName, ENT_QUOTES, "UTF-8"); ?> ですね。
</p>
<p><a href="">戻る</a></p>
<?php endif; ?>
↑ 変数fullNameが存在する場合、名前と戻るボタンを表示します。
最後に・・・
$_GET と $_POST の使い分けについては今後別の記事で取り上げたいと思います。
ユーザーからフォームの入力値を受け取る場合は $_POST/$_GETにアクセスしてはいけません。
POSTメソッドの場合は以下のように書きます。
$last_name = (string)filter_input(INPUT_POST, ‘last_name’);
$first_name = (string)filter_input(INPUT_POST, ‘first_name’);
GETメソッドの場合は INPUT_POSTを INPUT_GETに変えるだけです。
$last_name = (string)filter_input(INPUT_GET, ‘last_name’);
$first_name = (string)filter_input(INPUT_GET, ‘first_name’);
filter_input関数の第3引数に以下のものを使えばサニタイズしてくれます。
FILTER_SANITIZE_EMAIL:メールアドレス
FILTER_SANITIZE_ENCODED:URLエンコード
FILTER_SANITIZE_MAGIC_QUOTES:addslashes
FILTER_SANITIZE_NUMBER_FLOAT:浮動小数点
FILTER_SANITIZE_NUMBER_INT:整数
FILTER_SANITIZE_FULL_SPECIAL_CHARS:HTMLエスケープ
FILTER_SANITIZE_STRING、FILTER_SANITIZE_STRIPPED:htmlspecialchars
FILTER_UNSAFE_RAW、FILTER_DEFAULT:何もしない
コメントありがとうございます。
また、第3引数までご丁寧に説明いただき、重ねて感謝申し上げます。
ご指摘頂いた内容を調べていたところ、下記の記事にたどり着き、$_POST/$_GETで値を受け取る際はチェックが必要なので、filter_input()を使用したほうが短く書けるという内容は理解しました。
http://www.phppro.jp/qa/4576
ですが、色々な記事に「スーパーグローバル変数が、変更可能な(ミュータブルな)変数であるため、直接アクセスするのが危険」と書かれていますが、具体的にどう危険なのかを調べることができませんでした。もしよろしければ大変お手数ですがこの部分をご教示いただけますと助かります。
ありがとうございます。