質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

7281閲覧

PHPで会員登録画面を作る際に、action先の場合分けの方法

yassuda

総合スコア15

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/31 05:35

###前提・実現したいこと

PHPで会員登録をするプログラムを作っています。

会員登録画面→会員登録確認画面→会員登録完了画面

と三段階のシステムを作りたいです。
データベースはこの問題を解決した後に取り組みます。

enshu1-2.php→会員登録画面
enshu3.php→会員登録確認画面
###発生している問題・エラーメッセージ

エラーの時は同じ画面にエラーを表示し、正しい場合は次の会員登録確認画面に推移させたい。 そのためにformのaction先を場合分けしようとしているができない。

###該当のソースコード

PHP

1<?php 2$errors = array(); 3 4if(isset($_POST['submit']) && $_POST['submit'] ==="確認"){ 5 6 $name = $_POST['name']; 7 $data = $_POST['data']; 8 $address = $_POST['address']; 9 10 11 12 if($name === ""){ 13 $errors['name'] = "名前が入力されていません。"; 14 } 15 16 if($data === ""){ 17 $errors['data'] = "生年月日が入力されていません。"; 18 } 19 20 if($address === ""){ 21 $errors['address'] = "住所が入力されていません。"; 22 } 23} 24?> 25 26<!DOCTYPE html> 27<html> 28<head> 29 <title>会員登録画面</title> 30</head> 31<body> 32 33 <?php 34 echo "<ul>"; 35 foreach($errors as $message){ 36 echo "<li>"; 37 echo $message; 38 echo "</li>"; 39 } 40 echo "</ul>"; 41 ?> 42 43 <h1>会員登録画面</h1> 44 45 <?php 46 47 if($_POST['name'] != "" && $_POST['data'] != "" && $_POST['address'] != ""){ 48 $sent = "enshu3.php"; 49 50 }else{ 51 $sent = "enshu1-2.php"; 52 } 53?> 54 <form action = "<?=$sent?>" method = "POST"> 55 56 <p>名前:<br></p> 57 <input type="text" name="name" > 58 <br> 59 60<p>生年月日:<br></p> 61 <input type="text" name="data" > 62 <br> 63 64 <p>住所:<br></p> 65 <input type="text" name="address" > 66 <br> 67 <br> 68 69 <input type="submit" name = "submit" value="確認"> 70 </form> 71 72 73 74</body> 75 </html> 76

###試したこと
actionの値を変数にして、ifで場合分けしました。
ですが、正しい場合に次の画面に推移するのがもう一度入力した際になってしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)
[vagrant@localhost ~]$ php -v
PHP 5.4.45 (cli) (built: Feb 18 2017 15:55:26)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

$_SERVER['REQUEST_METHOD']も活用すると上手くできそうですね。$_POSTとか$_SESSIONとかも上手く使えば1ファイルで完結できます(個人的にファイルが増えるのが好きではないので・・・)

コメントをうけてのサンプルコード

これが完璧な回答というのではないので1つのやり方という風に捉えてください。
方針としては
0. 入力内容の送信は自身にする
0. 成功したらPOSTをそのままSESSIONに入れて確認画面にリダイレクト
0. 確認画面ではSESSIONを受け取って表示

※動作確認していますが確認できた全コードではなくポイントのみコメントをそえて追記しています。

入力画面

PHP

1<?php 2session_start(); //セッション開始 3//同画面にエラー表示、次画面に内容送信を実現するためにセッションを利用する 4 5//入力内容再表示のため初期値を持っておく 6$name = ""; 7$data = ""; 8$address = ""; 9//POST(確認ボタンのSubmit)されたことを感知 10if($_SERVER["REQUEST_METHOD"] === "POST"){ 11 12 //入力チェックの処理 //今のものをそのままどうぞ 13 14 //エラーがなかったら確認画面へリダイレクト 15 if(count($errors) == 0){ 16 //POST内容を全部セッション変数で受け取る 17 $_SESSION = $_POST; 18 header('Location:enshu3.php'); 19 exit; 20 } 21} 22 23?> 24 25//自画面に送信するためactionには何も設定しない 26 <form action = "" method = "POST"> 27 28//入力内容再表示のため入力コントロール部分を下記のように記述 29 30<p>名前:<br></p> 31<input type="text" name="name" value="<?= $name ?>"> 32<br> 33

確認画面

PHP

1<?php 2session_start(); //セッション開始 3//当該ファイル(画面)にてセッションが利用できるように 4 5$name = $_SESSION['name']; 6$data = $_SESSION['data']; 7$address = $_SESSION['address']; 8?> 9//あとは同じ 10//完了画面でも同様に$_SESSIONを受け取り、session_destroy()とかunset($_SESSION)とかで破棄しておくこと 11//submitじゃなくてもいけるようになりますが、submit使いたいなら受け取った値をtype=hiddenで置いとくのもありです。

ご提示のファイル名からしておそらく授業課題のようなものと見受けられます。
DB登録も作りこまれるようですので、セキュリティ対策も含めて組み込めるように色々と勉強してみてください。

参考URL

PHPマニュアル:session_start
PHPマニュアル:フォームの処理

追記

今回は現在のつくりを活かす方向でサンプルを提案させていただきましたが、
入力→確認→完了を別ファイルにすると結構色々とこねくりまわす必要が出てきます(セッション使ったりPHPでリダイレクトしたり)
「確認画面から入力画面に戻ることがあるか」と聞いたのは、基本入力画面は画面表示だけで確認画面にエラーチェックとエラー表示と再入力画面まで持ってくることもできるということが念頭にあったからです。
actionをenshu3.phpにしてenshu3.phpの方でエラーチェックを行い、エラーがあったときはエラー表示、入力コントロール表示としてみたら分かると思います。

投稿2017/05/31 05:56

編集2017/05/31 07:22
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yassuda

2017/05/31 06:13

すみません、もしよろしければどのように$_SERVER["REQUEST_METHOD"]を利用すればよいのか教えてください。
m.ts10806

2017/05/31 06:19

リンク貼ってますが、一通り読まれました?読まれた上で分からない点があったら聞いてください。
yassuda

2017/05/31 06:26

はい、読みました。POSTなのかGETなのかを判定するプログラムですよね? それをどう私のプログラムに応用するのかがわかりません。 知識不足ですみません・・
m.ts10806

2017/05/31 06:33 編集

確認画面から登録画面に戻ることはありますか?それがあるかないかで作りが大きく違いますし、現状のつくりだけでは難しいと思います。 ソースの全提供はさすがに難しい(質問者さんのためにもならない)のでポイントのみのざっくりサンプルなら提案できます。 回答に書いたように個人的には1ファイルで完結パターンが結構楽ですが、今回の質問者さんの作りも活かすべきとも思うので、ひとまず現状の作りに倣います。
yassuda

2017/05/31 06:35

戻ることはありません。 会員登録画面→①未入力がある場合:エラーを表示させた会員登録画面を再度表示        ②正しい場合:会員登録確認画面へ推移 という形です。 できればポイントのみでよいので教えてください・
m.ts10806

2017/05/31 06:50 編集

なるほど。確認画面から登録画面に戻ることがないのであれば考慮すべき事項は少なそうですね。 少々お待ちください。
m.ts10806

2017/05/31 07:23

ものすごく走り書きで申し訳ないですが、ポイント込みサンプルコードとポイント、あと気になる点などを追記しました。
m.ts10806

2017/05/31 07:34

いまさら気づいたのですが日付ならdataじゃなくてdateですね。
yassuda

2017/06/01 02:55

ほんとにありがとうざいました!! とてもわかりやすくて、自分でも考えながらできたのでとてもためになりました。 インターンでの課題で初めてのPHPでなにもわかっていなかったので助かりました。 確かにdateですね(笑)
m.ts10806

2017/06/01 03:03

確かに初めてのPHPということからすると若干テクニカルな内容も含まれますね。 少しずつステップアップしていきましょう。 入力内容のチェックも空かどうかだけではなく文字数のチェックや日付形式のチェックなどなど、DB登録を行うためにはDBに入れるのに正しい形以外はNOとするような処理も必要となってきますし、 セキュリティ(Webアプリケーションのセキュリティ対策で調べてください)対応も安全なシステムを作るためには覚えること身につけることがたくさんあります。 まずは今回作ったソースを自分でもちゃんと「なぜこう書いたか」を人に説明できることからはじめましょう。 がんばってください。
guest

0

正しい場合に次の画面に推移する

上記を実装した場合、PHP単体を頼ったバリデーションの場合、単純な遷移だと一連の処理の最後(成否判定)に画面遷移の処理が必要になります。(非同期通信でajaxを使ってphpでごにょごにょしたりとかは論外で)
javascriptを使って、バリデーションを行い、formのactionを成功時と失敗時で入れ替えるなんてことも、古からの技術として存在していますのでご確認を。

今の実装でphpによるhtml生成時に書き換える方法でやりたい場合は、あまりお勧めはできませんが、javascriptでヘッダーが書き込まれる前に、リダイレクトかける…事でしょうか。
こちらを参考にしてください。
※いろんなやり方があるので、あくまで参考までにしてください。

やはり、お前らのJavaScriptでのリダイレクト実装は間違っている
一見簡単に見えるJavaScriptでのリダイレクト(URL転送)ですが、よく知られた方法にはある落とし穴があり、Googleアナリティクスで正常な解析が行えなくなります。どんな落とし穴があるかと、その回避策について解説します。

投稿2017/05/31 05:59

raichi

総合スコア278

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

確認ですが、質問に書かれたソースは、「enshu1-2.php」でしょうか?
その場合、挙動は以下の順になるかと思います

  1. 最初「enshu1-2.php」を実行。$_POSTは空なので$sentは「enshu1-2.php」
  2. 各フォームを入力して、submitを押す
  3. $sentは「enshu1-2.php」なので、当然「enshu1-2.php」が再度実行される

ただ、$_POSTに値が入っているので、$sentに「enshu3.php」が設定される
0. 再度表示された「enshu1-2.php」の各フォームを入力し、submitを押すと「enshu3.php」が実行される

つまり、「enshu1-2.php」→「enshu1-2.php」→「enshu3.php」となることが問題とされているのかと、推測いたします。

入力値が正常ならば、「enshu1-2.php」→「enshu3.php」で、
入力値が異常ならば、「enshu1-2.php」→「enshu1-2.php」としたいのであれば
$sentを変えるのではなく、入力値が正常の場合、「enshu3.php」にリダイレクトさせる必要があります
($_POSTをリダイレクト先へ引き継ぐにはSessionやGETクエリーを使う等、工夫が必要です)

もし、フォームが入力された時点で即action先を変えたいのであれば
Javascriptなどを使ってクライアントサイドで行う必要があります。

投稿2017/05/31 07:12

編集2017/05/31 07:43
s-washion

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

enshu3.php

php

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset = “UFT-8”> 5 <title>会員登録内容確認画面</title> 6</head> 7<body> 8 9 <h1>会員登録内容確認画面</h1> 10 <br /> 11 12 <?php 13 14 $name = $_REQUEST['name']; 15 $data = $_REQUEST['data']; 16 $address = $_REQUEST['address']; 17 18 echo "名前:".$name."<br /><br />"; 19 echo "生年月日:".$data."<br /><br />"; 20 echo "住所:".$address."<br /><br />"; 21 22 ?> 23 24 <form action="http://127.0.0.1:8080/enshu4.php" method="POST"> 25 <input type="submit" value="登録"> 26</form> 27 28</body> 29 30</html> 31

投稿2017/05/31 05:39

yassuda

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問