- ベストアンサー
PHP構成
お世話になります。教えてください。 現在画面の設計段階です。 画面遷移としましては、 第1入力画面→第2入力画面→確認画面→完了画面 という感じの場合、皆様ならどのようなPHPファイルの構成にするでしょうか? それぞれの処理で、PHPファイルを分けますか? (例えばnyuryoku1.php、nyuryoku2.php、kakunin.php、kanryou.phpというように) 第1入力画面と第2入力画面にエラーがあった場合は次の画面に行かず、エラー内容をそれぞれのページの上のほうに赤色表示させて、入力した項目は入力された状態を保持したいのです。 このときページを分けると結構値の受け渡しが面倒になってしまいそうな気がするのですが・・・。 しかしひとつのPHPファイルで記述するとかなり長い記述になってしまいそうです。 アドバイス等ください。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
私もSSSIONを使っています。ただ、処理はswitchで振り分けてプログラムは1ファイル、あとはHTML部分をテンプレートのようにして読み込ませています。 nyuryoku.php(少しはしょっていますが) switch ($_POST["act"]) { case "nyuryoku1": $entchk = entchk("nyuryoku1"); < $entchk[0] を $_SESSION["nyuyoku1"] に登録 > if ($entchk[1] != "") { < nyuryoku1.html 読み込み > } else { < nyuryoku2.html 読み込み > } break; case "nyuryoku2": if ($_POST["submit"] == "リセット") { unset($_SESSION["nyuyoku1"]); < nyuryoku1.html 読み込み > } elseif ($_POST["submit"] == "戻る") { < nyuryoku1.html 読み込み > } else { $entchk = entchk("nyuryoku2"); < $entchk[0] を $_SESSION["nyuryoku2"] に登録 > if ($entchk[1] != "") { < nyuryoku2.html 読み込み > } else { < kakunin.html 読み込み > } } break; case "kakunin": if ($_POST["submit"] == "リセット") { unset($_SESSION["nyuyoku2"]); < nyuryoku2.html 読み込み > } elseif ($_POST["submit"] == "戻る") { < nyuryoku2.html 読み込み > } else { < メール送信等の処理 > < セッション破棄 > < kanryou.php読み込み > } break; default: < nyuryoku1.html 読み込み > } function entchk($act) { < ここも $act の値によって switch で case 分けして処理 > < 半角→全角、全角→半角、ひらがな統一、カタカナ統一等の処理 > < 入力内容の正当性チェック > < OK の場合のみ 配列 ($array) にセット > < NG の場合はそれぞれのエラーメッセージを変数 $errstr にセット > < 配列 $entchk = array($array, $errstr); を返す > } nyuryoku1.html 、nyuryoku2.html ではエラーメッセージの箇所に <?= $entchk[1] ?>を入れ、hidden で "act" を渡します。 リセットボタンは $_SESSION["nyuyoku1"] または $_SESSION["nyuyoku2"] にそれぞれ値があるかないかで、 <input type="riset" ....> と <input type="submit"> を使い分けます。 あとは、セッションから必要なデータを htmlspecialchar($_SESSION["name"]) のような形で書き出しています。
その他の回答 (5)
- gentaro
- ベストアンサー率47% (105/221)
私も基本的に下の方と同様、SESSION使っちゃいますね。楽なので。 >第1画面の入力エラーチェックは第2画面で行っています 個人的にはこの方法は嫌いかも。第1画面の入力エラーチェックは第1画面で行ってしまいます。 SESSIONだと確認画面のPGでも完了画面表示のPGでも、SESSION変数の値を拾うだけで済みますし。 ただしSESSIONは設定でタイムアウトもあり得ますから、入力途中で数時間放置すると、 今まで入れた値が消える可能性も(笑) それがいやなら全てhiddenで渡していきます。 1本のPGで済ませたい場合でも、ファイルはそれぞれ分けて作成して1本にrequire、でしょうかね。
お礼
ありがとうございます。 やはり第1画面の入力値のチェックは第1画面で、ということですね。 SESSIONのタイムアウトには気をつけさせていただこうと思います! すべてhiddenで、という方法も、検討してみようかと思います。 非常に勉強になりました。
- Ikonos00
- ベストアンサー率28% (86/302)
すみません、間違いを書いてました。 正しくは以下です。 第1入力画面(nyuryoku1.php) 入力画面表示 サブミットでnyuryoku1.phpへ 入力チェック(エラー表示) 入力値をセションにセット headerで第2入力画面へ(←ここ修正) 第2入力画面(nyuryoku2.php) 入力画面表示 サブミットでnyuryoku2.phpへ 入力チェック(エラー表示) 入力値をセションにセット headerで確認画面へ 確認画面(kakunin.php) 確認項目の表示 サブミットでkakunin.phpへ なんらかの処理 headerで完了画面へ 完了画面(kanryou.php) 完了画面表示
お礼
ありがとうございます。 ご丁寧に訂正していただきまして、とても嬉しいです。 本当にありがとうございました!
- chem_taro
- ベストアンサー率32% (33/101)
たぶん、別URLへジャンプすることができるかということですよね。 #2さんの解説にもありますが、Header関数を使ってHTTPヘッダに指定するのが一般的みたいです。 Header("Location: http://www.abc.com"); Header関数について http://jp2.php.net/manual/ja/function.header.php
お礼
ありがとうございます。 header関数は知りませんでした! 他のURLにジャンプすることもできるのですね、非常に勉強になりました!
- Ikonos00
- ベストアンサー率28% (86/302)
私だとこんな感じですかね。 一つのPHPファイルにするとメンテが面倒くさいので分けます。 第1入力画面(nyuryoku1.php) 入力画面表示 サブミットでnyuryoku1.phpへ 入力チェック(エラー表示) 入力値をセションにセット headerで第1入力画面へ 第2入力画面(nyuryoku2.php) 入力画面表示 サブミットでnyuryoku2.phpへ 入力チェック(エラー表示) 入力値をセションにセット headerで確認画面へ 確認画面(kakunin.php) 確認項目の表示 サブミットでkakunin.phpへ なんらかの処理 headerで完了画面へ 完了画面(kanryou.php) 完了画面表示
お礼
ありがとうございます。 第1入力画面で入力された値は、第1入力画面のPHPファイル内で入力値チェック、という感じなのですね。 大変勉強になりました!!
- chem_taro
- ベストアンサー率32% (33/101)
デバッグの利便性を考え、それぞれ別ページに分けたほうが、どのページに問題があるのかをつかみやすいかとは思います。 第1入力画面で入力した値は、第2入力画面から確認画面に移る際に、一緒に受け渡せば問題ないのではないでしょうか。 思いつきなので、あくまでご参考までに。 例) 第1画面から送信されるデータ ★氏名(入力フォームから) ★住所(入力フォームから) 第2画面から送信されるデータ 氏名(第1画面から受け取ったデータを) 住所(第1画面から受け取ったデータを) ★アドレス(入力フォームから) ★一言(入力フォームから) 第3画面から送信されるデータ 氏名(第2画面から受け取ったデータを) 住所(第2画面から受け取ったデータを) アドレス(第2画面から受け取ったデータを) 一言(第2画面から受け取ったデータを)
お礼
非常に勉強になりました、ありがとうございました!
補足
ありがとうございます。 別ページに分けたほうがやはり利便性がいいですよね。 なんのエラーもなく値を受け渡すのは簡単なのですが、例えば第1画面の入力値にエラーがあった場合、どこにエラーがあったか&入力された値を第1画面に戻さないといけません(第1画面の入力エラーチェックは第2画面で行っています)。 この処理が実際に実現可能なのかとちょっと疑問に思ったのですが・・・。 もしよろしければアドバイス等をよろしくお願いいたします。
お礼
ありがとうございます。 表示用HTMLと、起動ファイルのようなPHPファイルで作成する方法もよさそうだな、と考えておりましたので、詳しいご回答をいただけてとても勉強になりました。 ありがとうございました!!