半地下備忘録

たつさんの日記的ななにか。

PHPでフォーム送信後にURLが変わらないようにした

この前作ったフォームをちょっと直しました。直したいところは Progateの復習を兼ねてPHPでフォームのサンプルを作ってみました(コード付き) - 半地下備忘録 にも書いてあるんだけど、簡単に復習すると…

  • 未入力のものがあった場合のエラー処理
  • 入力されたメールアドレスのチェック(@が含まれているかどうかなど)
  • 表示させるだけじゃなくてメール飛ばしたりデータベースに登録したりしたい
  • attend.phpとsent.phpに分かれてるのもイケてない?

で、簡単にできそうな最後のやつ試してみました。サンプルページのURLとソースもあります。

修正前後

今まではattend.phpに入力された名前などの値をsent.phpに送って、表示させてた。そこをform.php自身に送って、表示させるようにしました。これで入力前も入力後もURLは変わらないぜ。

f:id:tatsu-n:20150304165433p:plain

実現する方法としてはif文を使って、

  • $_POST["name"]などが空なら入力フォームを表示
  • $_POST["name"]など全部に値が入っていればフォームを表示せずに値を表示する

という分岐を作ってあげただけ。

作ったページ:フォームのテスト

form.phpのソース

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>フォームのテスト</title>
</head>
<body>
<h1>フォームのテスト</h1>

<?php if ($_POST["name"] == "" || $_POST["company"] == "" || $_POST["email"] == "" || $_POST["attend"] == ""){ ?>
<p>すごいWebデザイナーの講演会を下記の内容で開催いたします。つきましては、出欠の可否をご連絡願います。</p>
<ul>
	<li>日 時 平成27年2月14日(土) 15時00分より</li>
	<li>場 所 ほげほげ会館 ふがふが会議室</li>
	<li>内 容 Webデザイナーの基礎</li>
</ul>

<form action="form.php" method="post">
	<label>名前</label>
	<input type="text" name="name" size="10" value="" />
	<br />
	<label>所属</label>
	<input type="text" name="company" size="10" value="" />
	<br />
	<label>メールアドレス</label>
	<input type="text" name="email" size="10" value="" />
	<br />
	<input type="radio" name="attend" value="出席します" id="ans1"><label for="ans1">出席します</label>
	<input type="radio" name="attend" value="欠席します" id="ans2"><label for="ans2">欠席します</label>
	<br />

	<input type="submit" name="register" value="登録" />
</form>

<?php }else{ ?>

<h2>入力内容</h2>
<ul>
	<li>名前:<?php echo htmlspecialchars($_POST['name']) ?></li>
	<li>所属:<?php echo htmlspecialchars($_POST['company']) ?></li>
	<li>メールアドレス:<?php echo htmlspecialchars($_POST['email']) ?></li>
	<li>出欠:<?php echo htmlspecialchars($_POST['attend']) ?></li>
</ul>
<p><a href="<?php echo $_SERVER["SCRIPT_NAME"]; ?>">戻る</a></p>
<?php } ?>

</body>
</html>

変なところやこうした方がいいよというのがあればぜひ教えてください。

この処理の大事なところ

このif文の記述がバラバラなっているところがミソだったりします。このPHPで入力がある場合とない場合の処理を分けているので、フォームの送信後にURLを変えずに表示することができている。

<?php if ($_POST["name"] == "" || $_POST["company"] == "" || $_POST["email"] == "" || $_POST["attend"] == ""){ ?>
<?php }else{ ?>
<?php } ?>

直したいところ

名前、所属を入力して、登録を押すと、当然フォームの画面のままなんだけど、名前、所属が消えてしまう。エラーで戻されるのは仕方ないとしても、入力したところまで消えちゃうのって1番ムキーーーーってなるやつじゃないですかー。やだー。
そんなわけで次に直すのはその辺の処理になるね。