postメソッドを利用したフォーム
「送信用フォーム」を記述したphpを用意(form.php)
<html>
<head>
<meta charset="utf-8">
<title>formを動かす</title>
</head>
<body>
<h1>formを動かす</h1>
<form action="form_receive_get.php" method="post">
<p>お名前:<input type = "text" name="your_name"></p>
<p>年齢:<input type="text" name="your_age"></p>
<input type="submit">
</form>
</body>
</html>
「受信する」phpを用意(form_receive.php)
<?php
var_dump($_POST);
print_r($_POST);
echo $_POST['your_name'];
echo $_POST['your_age'];
?>
<html>
<head>
<meta charset="utf-8">
<title>無題ドキュメント</title>
</head>
<body>
</body>
</html>
- form.phpでフォームに入力した情報がform_receiveで表示される
- フォームからpostメソッドを通じて送信される
- ポスト変数はシステムにあらかじめ組み込まれた予約語。連想配列の性質をもつ
- methodをそれぞれgetに変えるとデータの受け渡し方法がgetになる
変数を出力:短く表示するパターン
- ポスト変数の中身(生データ:row data)をいじりたくない
- さらに扱いやすくする為、変数の中に格納する
<?php
$name = $_POST['your_name'];
$age = $_POST['your_age'];
?>
<html>
<head>
<meta charset="utf-8">
<title>無題ドキュメント</title>
</head>
<body>
<p>あなたの名前は<?php echo $name;?>です</p>
<p>あなたの年齢は<?php echo $age;?>歳です</p>
</body>
</html>
- echoに記述した内容はタグとして認識される
- フォームにタグを入力するとechoで出力されてしまう
- これにより悪用されるおそれもある(クロスサイトスクリプティング)
- 以下のように記述するとタグが認識されない
<p>あなたの名前は<?php echo htmlspecialchars($name,ENT_QUOTES,'utf-8');?>です</p>
htmlspecialchars関数
- htmlspecialchars('文字列',エスケープの種類,'文字コード')
- タグ部分を展開できないようにして、文字列のように認識されるようにする
- ENT_QUOTES…エスケープの種類:実体参照。これを指定しないとデフォルトでは''をエスケープしてくれない
- utf-8…文字コードを指定しておく
予防策②リダイレクション(Redirection)
- 上のform_receive.phpにアクセスするとエラーが表示される
- これはformを経由しないとPOST変数の中身が空であるため
- 以下のようにform_receive.phpに記述すると、POST変数が空のときフォームページにリダイレクトされる
<?php
if( isset($_POST['your_name'] ) != true){
header('Location:form.php');
exit;
}
isset
- 変数の中身があれば真、なければ偽をbooleanで返す
- ※フォームに入力せず送信した状態は「偽」ではなく空文字String[0]が入るので「真」になる
header()関数
- header関数でLocation: URL指定すればリダイレクトできる
- header()関数自体は他にもたくさんの用途がある
exit()関数