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

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

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

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

Twig

Twig は、簡潔で可読性の高いテンプレートを記述することができ、 シンプルに記述することを目的として作られた PHPテンプレートエンジンです。

Q&A

解決済

2回答

1707閲覧

PHPでフォームでエラーメッセージが出た時にデータがそのまま残るようにしたい

dog57

総合スコア131

PHP

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

Twig

Twig は、簡潔で可読性の高いテンプレートを記述することができ、 シンプルに記述することを目的として作られた PHPテンプレートエンジンです。

0グッド

0クリップ

投稿2018/02/10 00:42

編集2018/02/10 04:31

入力フォーム→確認フォーム→登録完了
という上記の画面を作成しています。

確認フォームでバリデーションを行い
リダイレクトで入力フォームにエラーメッセージを表示させているのですが、

入力フォームでエラーメッセージが出たときに
データをそのまま残すにはどうしたらよいでしょうか?(チェックボックス)

ちなみに、確認フォームから戻るボタンで入力フォームに戻る時のデータは保持できています。

ご教授よろしくお願いします。

registration_form.html

html

1 <!-- インラインチェックボックス 趣味 --> 2 <div class="form-group"> 3 <label class="control-label col-md-4" for="checkbox">趣味 <span class="label label-info">任意</span></label> 4 <div class="col-md-4"> 5 <div class="checkbox"> 6 <label class="checkbox-inline"> 7 <input name="hobby['baseball']" type="checkbox" value="野球" {% if hobby.baseball is defined %} checked {% endif %}> 野球 8 </label> 9 <label class="checkbox-inline"> 10 <input name="hobby['football']" type="checkbox" value="サッカー" {% if hobby.football is defined %} checked {% endif %} > サッカー 11 </label> 12 </div> 13 </div> 14 </div>

registration_form.php 登録フォーム

php

1<?php 2// 開発時にこれを書かないのはNG 3ini_set('display_errors', true); 4error_reporting(E_ALL); 5 6session_start(); 7 8// 文字化けを治す 9header("Content-type: text/html; charset=utf-8"); 10 11// 変数の定義(初期化) 12$name = ""; 13$email = ""; 14$password = ""; 15$tel = ""; 16$prefectures = ""; 17$hobby = ""; 18$gender = ""; 19$contact = ""; 20 21$errorMsg = ''; 22 23 24 25// エラーメッセージ 26if (isset($_SESSION['errorMsg'])) { 27 28 if (count($errorMsg) >= 1) { 29 $errorMsg = $_SESSION['errorMsg']; 30 } 31} 32 33// 34// 確認フォームから戻った時のデータ保持 35// 36 37// name の入力データ保持 38if (isset($_SESSION['email'])) { 39 40 if ($_SESSION['name'] === $_SESSION['name']) { 41 $name = $_SESSION['name']; 42 43 } 44} 45 46//email の入力データの保持 47if (isset($_SESSION['email'])) { 48 49 if ($_SESSION['email'] === $_SESSION['email'] & isset($_SESSION['email'])) { 50 $email = $_SESSION['email']; 51 52 } 53 } 54 55 56//password の入力データの保持 57if (isset($_SESSION['password'])) { 58 59 if ($_SESSION['password'] === $_SESSION['password'] & isset($_SESSION['password'])) { 60 $password = $_SESSION['password']; 61 62 } 63} 64 65 66//tel の入力データの保持 67if (isset($_SESSION['tel'])) { 68 69 if ($_SESSION['tel'] === $_SESSION['tel'] & isset($_SESSION['tel'])) { 70 $tel = $_SESSION['tel']; 71 72 } 73} 74 75//prefectures の入力データの保持 76if (isset($_SESSION['prefectures'])) { 77 78 if ($_SESSION['prefectures'] === $_SESSION['prefectures'] & isset($_SESSION['prefectures'])) { 79 $prefectures = $_SESSION['prefectures']; 80 81 } 82} 83 84// hobby の入力データの保持 85if (isset($_SESSION['hobby'])) { 86 87 if ($_SESSION['hobby'] === $_SESSION['hobby'] & isset($_SESSION['hobby'])) { 88 $hobby = $_SESSION['hobby']; 89 90 } 91} 92 93 94// gender の入力データの保持 95if (isset($_SESSION['gender'])) { 96 97 if ($_SESSION['gender'] === $_SESSION['gender'] & isset($_SESSION['gender'])) { 98 $gender = $_SESSION['gender']; 99 100 } 101} 102 103// contact の入力データの保持 104if (isset($_SESSION['gender'])) { 105 106 if ($_SESSION['contact'] === $_SESSION['contact'] & isset($_SESSION['contact'])) { 107 $contact = $_SESSION['contact']; 108 109 } 110} 111 112 113 114 115 116// 117// Twig 118// 119 120 121// Composerで作成されたautoload.phpを読み込む 122require_once('../vendor/autoload.php'); 123// Twig_loader_Filesystemを使う。registration_form.phpからのtemplatesディレクトリを指定。(相対パス) 124$loader = new Twig_Loader_filesystem('../templates'); 125// $loaderをTwigの環境設定として twig instance を生成 126$twig = new Twig_Environment($loader); 127 128 129 130// render 131echo $twig->render('registration_form.html', array( 132 133 'name' => $name, 134 'email' => $email, 135 'password' => $password, 136 'tel' => $tel, 137 'prefectures' => $prefectures, 138 'hobby' => $hobby, 139 'gender' => $gender, 140 'contact' => $contact, 141 142 'errorMsg' => $errorMsg 143 144 145 ) 146); 147

confirm.php 確認フォーム

php

1 2/ 開発時にこれを書かないのはNG 3ini_set('display_errors', TRUE); 4error_reporting(E_ALL); 5 6session_start(); 7 8 9// 文字化けを治す 10header("Content-type: text/html; charset=utf-8"); 11 12// 変数の定義(初期化) 13$name = ""; 14$email = ""; 15$password = ""; 16$tel = ""; 17$prefectures = ""; 18$hobby = ""; 19$gender = ""; 20$contact = ""; 21$string = ""; 22 23 24$date = date_default_timezone_set('Asia/Tokyo'); 25 26 27$form_Content = array($name, $email, $password, $tel, $prefectures, $hobby, $gender, $contact); 28 29// エラーメッセージの配列の初期化 30$errorMsg = array(); 31// セッション変数の初期化 32$_SESSION['errorMsg'] = array(); 33// 初期化 34 35 36 37// XSS対策 サニタイズ(無毒化) 38function h($string) { 39 40 if(is_array($string)){ 41 return array_map("h", $string); 42 43 } else { 44 45 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 46 } 47} 48 49 // XSS対策 (hrefやsrcの値がURLか確認する) 50 function urlCheck($form_Content) { 51 if (!preg_match("/^(https?:.+)$/", $form_Content)) { 52 return $errorMsg[] = "不正を検知しました。"; 53 } else { 54 return true; 55 } 56 } 57 58 59 60// POST時 61if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') { 62 63 64 $_SESSION["name"] = filter_input(INPUT_POST, 'name'); 65 $_SESSION["email"] = filter_input(INPUT_POST, 'email'); 66 $_SESSION["password"] = filter_input(INPUT_POST, 'password'); 67 $_SESSION["tel"] = filter_input(INPUT_POST, 'tel'); 68 $_SESSION["prefectures"] = filter_input(INPUT_POST, 'prefectures'); 69 $_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 70 $_SESSION["gender"] = filter_input(INPUT_POST, 'gender'); 71 $_SESSION["contact"] = filter_input(INPUT_POST, 'contact'); 72 73 $name = $_SESSION["name"]; 74 $email = $_SESSION["email"]; 75 $password = $_SESSION["password"]; 76 $tel = $_SESSION["tel"]; 77 $prefectures = $_SESSION["prefectures"]; 78 $hobby = $_SESSION["hobby"]; 79 $gender = $_SESSION["gender"]; 80 $contact = $_SESSION["contact"]; 81 82 83 84// 85// 未入力チェック 86// 87 88// エラーメッセージの配列の初期化 89$errorMsg = array(); 90 91// 名前の未入力チェック 92if (empty($_SESSION["name"])) { 93 $errorMsg[] = "名前を入力してください。"; 94} 95 96// メールアドレスの未入力チェック 97if (empty($_SESSION["email"])) { 98 $errorMsg[] = "メールアドレスを入力してください。"; 99} 100 101// パスワードの未入力チェック 102if (empty($_SESSION["password"])) { 103 $errorMsg[] = "パスワードを入力してください。"; 104} 105 106// 電話番号の未入力チェック 107if (empty($_SESSION["tel"])) { 108 $errorMsg[] = "電話番号を入力してください。"; 109} 110 111// 都道府県の未入力チェック 112if ($_SESSION["prefectures"] == "選択") { 113 $errorMsg[] = "都道府県を選択してください。"; 114} 115 116 // 117 // 文字数チェック 118 // 119 120 // 名前の文字数チェック 121 if (strlen($_SESSION["name"]) >= 60) { 122 $errorMsg[] = "氏名が長すぎます。"; 123 } 124 125 // パスワード文字数チェック(8文字以上か) 126 if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $_SESSION["password"])) { 127 $errorMsg[] = "パスワードは8文字以上で入力してください。"; 128 } 129 130 // 電話番号の文字数チェック(10文字 or 11文字) 131 if (strlen($_SESSION["tel"]) >= 1 && strlen($_SESSION["tel"]) <= 9 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) { 132 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 133 } elseif (strlen($_SESSION["tel"]) >= 12 && preg_match("/^[0-9]+$/", $_SESSION["tel"])) { 134 $errorMsg[] = "電話番号は10文字か11文字で入力してください。"; 135 } 136 137 // 138 // 形式チェック 139 // 140 141 // メールアドレス形式チェック 142 if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_SESSION["email"]) && $_SESSION["email"] !== "") { 143 $errorMsg[] = "メールアドレスに間違いがあります。"; 144 } 145 146 // 電話番号の形式チェック 147 if (preg_match("/[-]+/", $_SESSION["tel"])) { 148 $errorMsg[] = "電話番号はハイフンなしで入力してください。"; 149 } 150 151 // 152 // 半角英数字チェック 153 // 154 155 // 電話番号の数字チェック 156 if (!preg_match("/[0-9]/", $_SESSION["tel"]) && $_SESSION["tel"] !== "") { 157 $errorMsg[] = "電話番号は半角数字で入力してください。"; 158 } 159 160 161 // 電話番号の全角チェック Todo 162 //if (strlen($tel) !== mb_strlen($tel, "UTF-8")) { 163 // $errorMsg[] = "電話番号に全角が含まれています。"; 164 //} 165 166 167 if (count($errorMsg) >= 1) { 168 $_SESSION['errorMsg'] = $errorMsg; 169 170 header("location: registration_form.php"); 171 exit; 172 173 } 174 175} 176 177 178 179// 180// Twig 181// 182 183// Composerで作成されたautoload.phpを読み込む 184require_once ('../vendor/autoload.php'); 185// Twig_loader_Filesystemを使う。confirm.phpからのtemplatesディレクトリを指定。(相対パス) 186$loader = new Twig_Loader_filesystem('../templates'); 187// $loaderをTwigの環境設定として twig instance を生成 188$twig = new Twig_Environment($loader); 189 190 191// render 192echo $twig->render('confirm.html', array ( 193 194 'name' => $name, 195 'email' => $email, 196 'password' => $password, 197 'tel' => $tel, 198 'prefectures' => $prefectures, 199 'hobby' => $hobby, 200 'gender' => $gender, 201 'contact' => $contact, 202 203 'errorMsg' => $errorMsg, 204 'string' => $string 205 206 207 ) 208); 209

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

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

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

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

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

m.ts10806

2018/02/10 03:33

ビュー部分よりもPOSTされた情報をどのように処理されているかが分かるコントローラ部分(PHPの処理)の方が大事だったりします。提示ソースはビュー部分だけなのでPHP側のソースもご提示いただけますか?
dog57

2018/02/10 04:31

追記いたしました。
guest

回答2

0

ベストアンサー

確認フォームに POST された内容を入力フォームへ差し戻します。
差し戻しに使うのは、POST を使うことが多いです。

registration_form.html を見ると、すでにデータが渡ればチェックが切り替わる仕組みは入っています。
ので差し戻しの仕組みと、正しい変数を与えてあげてください。

ちなみに、戻るボタンを使用した場合は、ブラウザに保存された内容を表示しているだけなので、「データが保持されている」というのはちょっと違います。

コードが追記されたので
差し戻しに POST ではなく、session を使用していますね。
で、ざっと見た感じでは、データは戻されています。
{% if hobby.baseball is defined %}
が動作していないのであれば、
・twig にデータが渡っているか?
を取っ掛かりに、切り分けをすれば良いです。

投稿2018/02/10 01:51

編集2018/02/11 00:22
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dog57

2018/02/10 01:56

エラー(バリデーション)が出た時に、同時にそのままデータを保持させるためにはどうしたらよいでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/10 02:01

書いたとおりです。 差し戻しに使うのは、POST を使うことが多いです。
退会済みユーザー

退会済みユーザー

2018/02/11 00:23

コードが追記されたので、回答に反映しました。
guest

0

フィルターは第三引数のみなので

$_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);

だと、第四引数に配列以外が設定されているから false やら null が帰ってきてるかとおもいますよ

第三引数が int $filter となっているのでフィルタに設定できる型であれば

# 説明用のコード ノーテストのため間違えてる恐れもあり $_SESSION["hobby"] = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT | FILTER_REQUIRE_ARRAY);

のような感じになるかと思います。

投稿2018/02/11 02:39

編集2018/02/11 02:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問