PHP実習 (03) 入力フォームの確認を表示 1

PHP実習 (03) 入力フォームの確認を表示 1

*解答はHTMLコード、HTML&PHPコードと書かれたところをクリックすると表示されます。

問題 次のサンプルのように「PHP実習 (2)入力フォームで入力されたデータを表示」を変更して、入力データを確認した上でデータを表示させるようにしましょう。
サンプル 入力フォームと確認ページ、そして最終表示のページ、3つのファイルを作成します。
HTMLフォーム
   <form name="form1" id="form1" method="post" action="sample2a.php">
    <table cellpadding="0" cellspacing="0" summary="お問い合わせフォーム" id="formTable">
      <caption>
      お問い合わせフォーム
      </caption>
      <tr>
        <th><label for="subject">お問い合わせ内容</label></th>
        <td><select name="subject" id="subject">
            <option value="選択してください" selected="selected">選択してください</option>
            <option value="予約について">予約について</option>
            <option value="メニューについて">メニューについて</option>
          </select></td>
      </tr>
      <tr>
        <th><label for="name">お名前</label></th>
        <td><input type="text" name="name" id="name" value="" size="20" /></td>
      </tr>
      <tr>
        <th><label for="tel">電話番号</label></th>
        <td><input type="text" name="tel" id="tel" value="" size="20" /></td>
      </tr>
      <tr>
        <th><label for="email">メールアドレス</label></th>
        <td><input type="text" name="email" id="email" value="" size="20" /></td>
      </tr>
      <tr>
        <th>ご連絡方法</th>
        <td><input type="radio" name="contact" id="contact1" value="メール" />
          <label for="contact1">メール</label>
          <input type="radio" name="contact" id="contact2" value="電話" />
          <label for="contact2">電話</label></td>
      </tr>
      <tr>
        <th>当店を何でお知りになりましたか</th>
        <td id="checkBoxData"><p>
            <input type="checkbox" name="what[]" id="magazine" value="雑誌" />
            <label for="magazine">雑誌</label>
          </p>
          <p>
            <input type="checkbox" name="what[]" id="web" value="ホームページ" />
            <label for="web">ホームページ</label>
          </p>
          <p>
            <input type="checkbox" name="what[]" id="friend" value="友人・知人" />
            <label for="friend">友人・知人</label>
          </p>
          <p>
            <input type="checkbox" name="what[]" id="signboard" value="看板" />
            <label for="signboard">看板</label>
          </p>
          <p>
            <input type="checkbox" name="what[]" id="etc" value="その他" />
            <label for="etc">その他</label>
          </p></td>
      </tr>
      <tr>
        <th><label for="free">自由記入欄</label></th>
        <td><textarea name="free" id="free" cols="25" rows="5"></textarea>
          <p class="notes">※ご予約の場合は、希望日時をご記入ください。</p></td>
      </tr>
    </table>
    <div id="formButton">
      <input type="submit" name="submit" id="submit" value="送信" />
      <input type="reset" name="reset" id="reset" value="リセット" />
    </div>
  </form>
HTML&PHPコード(確認ファイル)
<?php
session_start();
if (isset($_POST['name']) === TRUE) { $_SESSION['name'] = $_POST['name']; }
if (isset($_POST['tel']) === TRUE) { $_SESSION['tel'] = $_POST['tel']; }
if (isset($_POST['email']) === TRUE) { $_SESSION['email'] = $_POST['email']; }
if (isset($_POST['contact']) === TRUE) { $_SESSION['contact'] = $_POST['contact']; }
if (isset($_POST['subject']) === TRUE) { $_SESSION['subject'] = $_POST['subject']; }
if (isset($_POST['free']) === TRUE) { $_SESSION['free'] = $_POST['free']; }
if (isset($_POST['what']) === TRUE) { $_SESSION['what'] = $_POST['what']; }
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>sample</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/base.css">
</head>
<body>
<header>
  <div class="inner">
    <h1>フォーム Sample</h1>
  </div>
</header>
  <article>
    <h2>フォーム入力内容</h2>
    <section>
      <p>
        <?php
    $name = htmlspecialchars($_POST['name'], ENT_QUOTES);
    $tel = htmlspecialchars($_POST['tel'], ENT_QUOTES);
    $email = htmlspecialchars($_POST['email'], ENT_QUOTES);
    $contact = htmlspecialchars($_POST['contact'], ENT_QUOTES);
    $subject = htmlspecialchars($_POST['subject'], ENT_QUOTES);
    $free = htmlspecialchars($_POST['free'], ENT_QUOTES);
    echo "<br>お問い合わせ内容:".$subject.
      "<br>名前:".$name.
      "<br>電話番号:".$tel.
      "<br>メールアドレス:".$email.
      "<br>連絡方法:".$contact.
      "<br>当店を何でお知りになりましたか:";
    foreach($_POST['what'] as $what){
      print(htmlspecialchars($what, ENT_QUOTES)."、");
    }
    echo "<br>自由記入欄:".$free;
    ?>
      </p>
      <p><a href="sample1.html">戻る</a> | <a href="sample_end2.php">次へ</a></p>
    </section>
  </article>
  <footer> <small>All rights reserved STUDIO.M 2014</small> </footer>

</body>
</html>
 
HTML&PHPコード(最終表示ファイル)
<?php
session_start();
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>sample</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/base.css">
</head>
<body>
<header>
  <div class="inner">
    <h1>フォーム Sample</h1>
  </div>
</header>
  <article>
    <h2>フォーム入力内容</h2>
    <section>
      <p>
        <?php
    $name = htmlspecialchars($_SESSION['name'], ENT_QUOTES);
    $tel = htmlspecialchars($_SESSION['tel'], ENT_QUOTES);
    $email = htmlspecialchars($_SESSION['email'], ENT_QUOTES);
    $contact = htmlspecialchars($_SESSION['contact'], ENT_QUOTES);
    $subject = htmlspecialchars($_SESSION['subject'], ENT_QUOTES);
    $free = htmlspecialchars($_SESSION['free'], ENT_QUOTES);
    echo "<br>お問い合わせ内容:".$subject.
      "<br>名前:".$name.
      "<br>電話番号:".$tel.
      "<br>メールアドレス:".$email.
      "<br>連絡方法:".$contact.
      "<br>当店を何でお知りになりましたか:";
    foreach($_SESSION['what'] as $what){
      print(htmlspecialchars($what, ENT_QUOTES)."、");
    }
    echo "<br>自由記入欄:".$free;
    ?>
      </p>
    </section>
  </article>
  <footer> <small>All rights reserved STUDIO.M 2014</small> </footer>
<?php session_unset(); ?>
</body>
</html>

解説

変数に格納されたデータの寿命はそのページが表示されている間です。
確認用のページから最終表示のページまでデータを保持するためにセッションを利用します。

  1. session_start()関数でセッションを開始
  2. 次にスーパーグローバル変数$_SESSION[]にフォームから受け取ったデータを渡します。
    これでページをまたいでのデータ保持ができます。この際if制御文でデータの有無を確認の上で代入を行います。
    if (isset($_POST['name']) === TRUE) { $_SESSION['name'] = $_POST['name']; }
    

    このif文は isset($_POST[‘name’]) === TRUE を使って条件判定をしています。
    isset()は引数に指定した変数が存在していればTRUEを返します。この場合は$_POST[‘name’])に値が格納されていたなら$_SESSION[‘name’]にその値を格納します。
  3. 次は最後の表示用のファイルです。次の部分を書き換えます。
        $name = htmlspecialchars($_POST['name'], ENT_QUOTES);
        $tel = htmlspecialchars($_POST['tel'], ENT_QUOTES);
        $email = htmlspecialchars($_POST['email'], ENT_QUOTES);
        $contact = htmlspecialchars($_POST['contact'], ENT_QUOTES);
        $subject = htmlspecialchars($_POST['subject'], ENT_QUOTES);
        $free = htmlspecialchars($_POST['free'], ENT_QUOTES);
    

    $_POST[]を$_SESSION[]として確認用のページでセッションを利用して保存したデータを取り出します。
        $name = htmlspecialchars($_SESSION['name'], ENT_QUOTES);
        $tel = htmlspecialchars($_SESSION['tel'], ENT_QUOTES);
        $email = htmlspecialchars($_SESSION['email'], ENT_QUOTES);
        $contact = htmlspecialchars($_SESSION['contact'], ENT_QUOTES);
        $subject = htmlspecialchars($_SESSION['subject'], ENT_QUOTES);
        $free = htmlspecialchars($_SESSION['free'], ENT_QUOTES);
     
  4. 最後にセッションを終了する関数をbodyの終了タグの前に入れます。
    <?php session_unset(); ?>
    

さて、ここで問題がひとつ出てきます。確認画面から最終画面まではデータを保持することができたのですが、もし確認画面でミスを発見してもとの入力画面に戻った時です。
この状態でしたら最初の入力画面に戻ると全てのデータが消えてしまいます。ユーザーは再び最初からの入力になってしまいます。
確認画面から入力画面に戻ってもデータが消えない方法を考える必要がでてきます。
次の実習でそれを実現してみましょう。