- 締切済み
フォームの入力チェック処理について
確認ボタンを押しエラーがあればエラーメッセージを出力し なければ確認画面に移りたいと考えているのですがうまくいきません。 具体的には 1:入力フォームを表示 2-1:送信ボタンを押しエラーがあればメッセージ出力 2-2:送信ボタンを押しエラーがなければhiddenのname="mode" value="confirm"を渡す hiddenの値はswitchのcase文の値でconfirmで確認画面を表示します。 入力フォームを表示する段階にてhiddenを渡しているのが原因なのは わかるのですがエラーチェックを通す際の構文がわかりません・・・ また、hiddenを消すとエラーチェックが通るのですが例えば名前を入力 しメールを入力しない状態で 送信ボタンを押すとメールの入力を促すエラーメッセージが表示され名前の入力も消えてしまいます。 これは回避できるのでしょか? 見づらいかと思うのですが下記のソースです。宜しくお願い致します。 function input() { if(isset($_POST{"submit"})) { if (empty($_POST["name"])) { $error_message[] = "お名前を入力して下さい。"; } if (empty($_POST["email"])) { $error_message[] = "メールアドレスを入力して下さい。"; }if (count($error_message)) { echo "<p style=\"color: #ff0000\">入力内容にエラーがあります。</p>\n"; foreach ($error_message as $message) { echo "<p style=\"color: #ff0000\">" . "・$message" . "</p>\n"; } } } echo "<form method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "\">\n"; echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<td>お名前</td>\n"; echo "<td><input type=\"text\" name=\"name\" size=\"20\"></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td>メールアドレス</td>\n"; echo "<td><input type=\"text\" name=\"email\" size=\"20\"></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td>メッセージ</td>\n"; echo "<td><textarea name=\"msg\" rows=\"5\" cols=\"40\"></textarea></td>\n"; echo "</tr>\n"; echo "<tr>\n"; echo "<td colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"内容を確認\"></td>\n"; echo "</tr>\n"; echo "</table>\n"; echo "<input type=\"hidden\" name=\"mode\" value=\"confirm\" />\n"; echo "</form>\n"; }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- tamakiii
- ベストアンサー率80% (4/5)
ちょっと気分転換に簡単な物を作っていたんですが、作っている途中に体調が悪くなってしまった為詳細なコメントはご勘弁下さい…。 投稿しようか悩んだんですが、訳にたつと思える情報を複数記述しましたので…。 不明点がありましたらまたお教えしますね。 [index.php] ======================================== <?php /** * エラー表示設定の変更。 * NOTICE まで表示すると、インプットの中に "<br />" と入ってしまうので…w */ error_reporting('E_ALL ^ E_NOTICE'); /** * @method isMail(string $text) * $text がメールアドレスかを調べる関数。 * 正しいメールアドレスの形式である場合 true を、そうでない場合に false を返す。 * 引用元:phpspot様 * http://phpspot.net/php/pg%90%B3%8BK%95%5C%8C%BB%81F%83%81%81%5B%83%8B%83A%83h%83%8C%83X%82%A9%82%C7%82%A4%82%A9%92%B2%82%D7%82%E9.html * ちょっと動作がおかしいです。 */ function isMail($text) { if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $text)) { return true; } else { return false; } } /** * @method errorExists(void) * エラーが存在した時、エラーメッセージを含む配列を返す関数。 * 存在しない場合は false を返す。 */ function errorExists() { if (isset($_POST["submit"])) { $error_messages = array(); if (empty($_POST["name"])) { $error_messages[] = "お名前を入力して下さい。"; } else if (strlen($_POST['name']) < 6) { $error_messages[] = "お名前が短すぎます。全角3文字以上で入力して下さい。"; } if (empty($_POST["email"])) { $error_messages[] = "メールアドレスを入力して下さい。"; } else if (!isMail($_POST['email'])) { $error_messages[] = "メールアドレスの欄に入力された値はメールアドレスではありません。\n" . "正しい形式で再度入力をお願いします。"; } if (empty($_POST['msg'])) { $error_messages[] = "メッセージを入力して下さい。"; } if ($error_messages === array()) { return false; } else { return $error_messages; } } else { return false; } } ?> <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Cheer you up!</title></head> <body style="margin: 0; padding: 0; text-align: center;"><div style="width: 800px; margin: 0 auto; text-align: left;"> <?php /** * @epex * * foreach ($params as $param) { ... } * if ($param) { ... } else { ... } * などは * foreach ($params as $param) : ... endforeach; * if ($param) : ... else : ... endif; * この様に書く事も出来ます。HTMLの中に埋め込む際にはよく使用されます。 */ ?> <?php /* エラーがあれば、エラーメッセージを表示する */?> <?php if (($error_messages = errorExists()) != false) : ?> <div style="border: solid #999 1px; margin: 20px 0;"> <div style="margin: 1px; border: dotted #DDD 1px;"> <?php foreach ($error_messages as $error_message) : ?> <p style="font-size: 0.8em; color: red; margin: 10px;"><?php echo str_replace("\n", '<br />', $error_message); ?></p> <?php endforeach; ?> </div> </div> <?php endif; ?> <?php /** * > 送信ボタンを押すとメールの入力を促すエラーメッセージが表示され名前の入力も消えてしまいます。 * これは、このページに最初に来た時に、input に何も入力されていないのと同じ事です。 * 試しに <input type="text" name="name" value="hell oh world :D" /> * として、submitを押してみて下さい。内容は変わらず、 "hell oh world :D" になっているはずです。 * * ユーザーが入力した値を2回目以降に表示したい場合は、 * <input type="text" name="name" value="<?php echo $_POST['name']; ?>" /> * などとする必要があります。 * * @notice * ポストされてきたデータを直接出力するのは、問題がある場合がありますのでこのコードを信じないで下さいw */ ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <table border="1" style="width: 100%;"> <tr> <td>お名前</td> <td><input type="text" name="name" style="width: 100%;" value="<?php echo $_POST['name']; ?>" /></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="email" style="width: 100%;" value="<?php echo $_POST['email']; ?>" /></td> </tr> <tr> <td>メッセージ</td> <td><textarea name="msg" rows="5" style="width: 100%;"><?php echo $_POST['msg']; ?></textarea></td> </tr> <tr> <td colspan="2"><input type="submit" name="submit" value="内容を確認" /></td> </tr> </table> <input type="hidden" name="mode" value="confirm" /> </form> </body></html>
お礼
お返事ありがとうございます。 なんとなくではありますがおかげ様でイメージを掴む事ができました。 引き続き自分なりにも調べてみたのですがhiddenではなくsessionで値を 渡したほうがセキュリティ的にもいいみたいなのですが疑問があります。 例えばフォームに入力された値を渡す場合は session_start(); $_SESSION["name"] = $_POST["name"]; ・・・フォームの数だけ以下同文・・・ と定義し表示させたい箇所に echo $_SESSION["name"]; でいいのですがhiddenで渡すような値についてはどう渡せばいいのでしょうか? フォーム1つにファイル数をあまり増やしたくないので1つのphpファイルで 入力画面,エラーチェック,確認画面,送信完了まで各部分をfunctionで定義し hiddenの値を取得しcase文で分岐しております。 多少ややこしいのですがいろいろ調べてみると新たな情報に出会い余計 ややこしくなってしまいます・・・w 最初の質問と変わってしまい大変恐縮ですが教えて頂けますと幸いです。