*解答は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>
解説
変数に格納されたデータの寿命はそのページが表示されている間です。
確認用のページから最終表示のページまでデータを保持するためにセッションを利用します。
- session_start()関数でセッションを開始
- 次にスーパーグローバル変数$_SESSION[]にフォームから受け取ったデータを渡します。
これでページをまたいでのデータ保持ができます。この際if制御文でデータの有無を確認の上で代入を行います。if (isset($_POST['name']) === TRUE) { $_SESSION['name'] = $_POST['name']; }
このif文は isset($_POST[‘name’]) === TRUE を使って条件判定をしています。
isset()は引数に指定した変数が存在していればTRUEを返します。この場合は$_POST[‘name’])に値が格納されていたなら$_SESSION[‘name’]にその値を格納します。 -
次は最後の表示用のファイルです。次の部分を書き換えます。
$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);
- 最後にセッションを終了する関数をbodyの終了タグの前に入れます。
<?php session_unset(); ?>
さて、ここで問題がひとつ出てきます。確認画面から最終画面まではデータを保持することができたのですが、もし確認画面でミスを発見してもとの入力画面に戻った時です。
この状態でしたら最初の入力画面に戻ると全てのデータが消えてしまいます。ユーザーは再び最初からの入力になってしまいます。
確認画面から入力画面に戻ってもデータが消えない方法を考える必要がでてきます。
次の実習でそれを実現してみましょう。