- ベストアンサー
PHPでセッションを使用したフォーム作成方法とエラーハンドリングについて
- 現在PHPにてsessionを使用したフォームを作成しております。
- PHP初心者の方がセッションを使用してフォームを作成している際、エラーハンドリングで苦戦しているようです。
- 特にconfirm.phpのページに遷移させる方法について質問しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 以上のソースに書き換えたところ、空入力でもcomplete.phpに通ってしまいます。 > form.php > <input type="hidden" name="contact" value="<?php $_SESSION['contact']; ?>" /> 最初はセッション変数に何も入っていないので、value="" でPOSTされます。 > complete.php > $contact = $_POST['contact']; > if (!count($contact)) { > header("Location: index.php"); > exit; > } 上記のPOSTから $contact="" となりますが、これは長さ0の文字列というデータが入っているということなので、 count($contact)の返す値は0ではありません。 したがって、判定文の中の転送処理は実行されないので、そのままcomplte.php内のhtmlが表示されます。 $contactに""以外の有効な設定値が入っていないことを判定するなら > if (!count($contact)) { ではなく、 if (empty($contact)) { とした方が妥当でしょう。 empty($contact)なら$contact=""でも$contactの値が空と見なされます。
その他の回答 (1)
- magicalpass
- ベストアンサー率58% (378/648)
どちらのソースも$contactは代入がなく参照・評価しかされてないのだけど…… > if (isset($_POST["contact"])) { ここは$_POST["contact"]の内容が""であっても通るので、 > if (!count($contact)) { > $_SESSION["comment"] = $comment; > header("Location: contact.php"); > exit; > } ここを通れば100%転送されて戻ってしまいます。 $contactが何を意味する変数なのか知りませんが、きちんと値を入れる必要があるかと。
補足
お忙しい中、ご回答有難う御座います。 > $contactが何を意味する変数なのか知りませんが、きちんと値を入れる必要があるかと。 <input type="hidden" name="contact" value="">にしようしています。 ソースを書き変えました。 以下になるのですが、いかがでしょうか? /* form.php ------------------- */ <?php //セッションを開始 session_start(); ?> <html> <body> <form action="complete.php" method="post"> <dl> <dt>名前</dt> <dd> <?php echo $_SESSION['err_name']; ?> <input type="text" size="20" name="name" value="<?php echo $_SESSION['name']; ?>" /> </dd> <dt>コメント</dt> <dd> <?php echo $_SESSION['err_comment']; ?> <textarea name="comment" rows="5" cols="40"><?php echo $_SESSION['comment']; ?></textarea> </dd> </dl> <input type="hidden" name="contact" value="<?php $_SESSION['contact']; ?>" /> <input type="submit" name="submit" value="確認" /> </form> </body> </html> /* complete.php ------------------ */ <?php //セッションを開始 session_start(); $name = $_POST['name']; $comment = $_POST['comment']; $contact = $_POST['contact']; if (isset($contact)) { // 名前欄をチェック if (empty($name)) { $_SESSION['err_name'] = "<p>お名前は必須項目です。</p>"; } // 質問・コメント欄をチェック if (empty($comment)) { $_SESSION['err_comment'] = "<p>質問・コメントを入力してください。</p>"; } if (!count($contact)) { header("Location: index.php"); exit; } } // POSTされたデータとエラーメッセージをセッション変数に保存 $_SESSION['name'] = $name; $_SESSION['comment'] = $comment; $_SESSION['contact'] = $contact; ?> <html> <body> <dl> <dt>名前</dt> <dd><?php echo $name; ?></dd> <dt>内容</dt> <dd><?php echo $comment; ?></dd> </dl> </body> </html> 以上のソースに書き換えたところ、空入力でもcomplete.phpに通ってしまいます。 ページを戻るとエラーが表記されるようになります。 まだ勉強して間もないため、違っているとこのソースなどをご教授いただければと思います。 ご面倒かと思いますが、よろしくお願いします。