Webデザインの勉強と製作 | あかとんぼ

フェリカテクニカルアカデミーの学習をベースに、Webについての勉強と製作の過程をまとめています。

[PHP]②フォームの基本

postメソッドを利用したフォーム

「送信用フォーム」を記述したphpを用意(form.php
<!DOCTYPE HTML>
<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
//$_POSTの構造をvar_dumpかprint_rでブラウザに表示する(デバッグ用)
var_dump($_POST);
print_r($_POST);
//ポスト変数$_POSTにはformからpostメソッドで送られた内容が一時的に保存される
//そのうちname属性を指定したデータをechoで表示
  echo $_POST['your_name'];
  echo $_POST['your_age'];
?>
<!DOCTYPE HTML>
<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'];
?>
<!DOCTYPE HTML>
<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()関数