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

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

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

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Q&A

解決済

1回答

2163閲覧

PHPにて入力チェックのエラー時にリダイレクトで入力値の保持をしたい

hj_petricall

総合スコア2

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

0グッド

0クリップ

投稿2020/07/02 02:31

編集2020/07/02 05:52

前提・実現したいこと

PHPにて社員情報の登録画面を作っています。
入力チェックでリダイレクト後に、セッションで入力した値を保持したいです。

大まかな動きとしましては

form.phpで値を入力

check.phpで入力チェック

エラーの場合はform.phpにリダイレクト
okの場合は確認画面が表示

リダイレクトをした際に入力した値が保持される

このようにしたいです

###発生している問題・エラーメッセージ

生年月日はプルダウン型で選択できるようになっているのですが、
リダイレクトした際にプルダウンの値が選択した値が複数並ぶようになってしまいます。

PHP

1 生年月日: 2 <?php 3 echo '<select name="year">'. "\n"; 4 $start = date('Y'); 5 $end = date('Y') - 100; 6 for($i = $start; $i >= $end; $i--) 7 { 8 echo '<option value="' .$i . '">' . $_SESSION['year'] .'</option>'. "\n"; 9 } 10 echo '</select>年' . "\n"; 11 echo '<select name="month">' . "\n"; 12 for ($i = 1; $i <= 12; $i++) 13 { 14 echo '<option value="' .$i . '">' . $_SESSION['month'] .'</option>'. "\n"; 15 } 16 echo '</select>月' . "\n"; 17 echo '<select name="day">' . "\n"; 18 for ($i = 1; $i <= 31; $i++) 19 { 20 echo '<option value="' .$i . '">' . $_SESSION['day'] .'</option>'. "\n"; 21 } 22 echo '</select>日' . "\n"; 23 ?>

↓現在の実装状況です

form.php

PHP

1<? 2session_start(); 3$page_flag = 0; 4?> 5 6<!DOCTYPE html> 7<html lang = "ja"> 8<head> 9<meta charset="UTF-8"> 10<title>新規登録画面</title> 11<link rel="stylesheet" href="../css/bootstrap.css"> 12</head> 13<body> 14<h2>新規登録</h2> 15<? 16if(isset($_SESSION['error'])) 17{ 18 $page_flag = 1; 19} 20 21// 初期画面 22if(empty($_POST['send']) && $page_flag === 0) 23{ 24?> 25 <form method="POST" action ="check.php"> 26 <p> 27 社員番号: 28 <input type="number" min="1" max="9999" name="employee_num"> 29 </p> 30 <p> 31 氏名: 32 <input type="text" name="employee_name"> 33 </p> 34 <p> 35 性別 36 <select name = "sexual"> 37 <option value="" hidden>-</option> 38 <option value="1"></option> 39 <option value="2"></option> 40 </select> 41 </p> 42 <p> 43 所属部署: 44 <select name="department"> 45 <option value="" hidden>選択してください</option> 46 <option value="1">システム部</option> 47 <option value="2">営業部</option> 48 <option value="3">総務部</option> 49 </select> 50 </p> 51 <p> 52 生年月日: 53 <?php 54 echo '<select name="year">'. "\n"; 55 $start = date('Y'); 56 $end = date('Y') - 100; 57 for($i = $start; $i >= $end; $i--) 58 { 59 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 60 } 61 echo '</select>年' . "\n"; 62 echo '<select name="month">' . "\n"; 63 for ($i = 1; $i <= 12; $i++) 64 { 65 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 66 } 67 echo '</select>月' . "\n"; 68 echo '<select name="day">' . "\n"; 69 for ($i = 1; $i <= 31; $i++) 70 { 71 echo '<option value="' .$i . '">' . $i .'</option>'. "\n"; 72 } 73 echo '</select>日' . "\n"; 74 ?> 75 </p> 76 <p> 77 電話番号: 78 <input type="text" name="phone_num" onKeyup="this.value=this.value.replace(/[^0-9]+/,'')"> 79 </p> 80 <p> 81 住所: 82 <input type = "text" name="street"> 83 </p> 84 <input type="submit" name="send" value="登録"> 85 </form> 86<? 87} 88elseif($page_flag === 1) 89{ 90 foreach($_SESSION['error'] as $value) 91 { 92 93 ?> 94 <div class="text-danger"> 95 <? 96 echo $value."<br>"; 97 ?> 98 </div> 99 <? 100 } 101?> 102 <form method="POST" action ="error.php"> 103 <p> 104 社員番号: 105 <input type="number" min="1" max="9999" name="employee_num" value=<?php echo htmlspecialchars($_SESSION['employee_num'], ENT_QUOTES, 'UTF-8'); ?>> 106 </p> 107 <p> 108 氏名: 109 <input type="text" name="employee_name" value="<?php echo htmlspecialchars($_SESSION['employee_name'], ENT_QUOTES, 'UTF-8'); ?>"> 110 </p> 111 <p> 112 性別: 113 <select name="sexual"> 114 <option value="" hidden>-</option> 115 <option value="1" <?php if ($_SESSION['sexual'] === 1) echo "selected" ?>></option> 116 <option value="2" <?php if ($_SESSION['sexual'] === 2) echo "selected" ?>></option> 117 </select> 118 </p> 119 <p> 120 所属部署: 121 <select name="department"> 122 <option value="" hidden>選択してください</option> 123 <option value="1" <?php if ($_SESSION['department'] === 1) echo "selected" ?>>システム部</option> 124 <option value="2" <?php if ($_SESSION['department'] === 2) echo "selected" ?>>営業部</option> 125 <option value="3" <?php if ($_SESSION['department'] === 3) echo "selected" ?>>総務部</option> 126 </select> 127 </p> 128 <p> 129 生年月日: 130 <?php 131 echo '<select name="year">'. "\n"; 132 $start = date('Y'); 133 $end = date('Y') - 100; 134 for($i = $start; $i >= $end; $i--) 135 { 136 echo '<option value="' .$i . '">' . $_SESSION['year'] .'</option>'. "\n"; 137 } 138 echo '</select>年' . "\n"; 139 echo '<select name="month">' . "\n"; 140 for ($i = 1; $i <= 12; $i++) 141 { 142 echo '<option value="' .$i . '">' . $_SESSION['month'] .'</option>'. "\n"; 143 } 144 echo '</select>月' . "\n"; 145 echo '<select name="day">' . "\n"; 146 for ($i = 1; $i <= 31; $i++) 147 { 148 echo '<option value="' .$i . '">' . $_SESSION['day'] .'</option>'. "\n"; 149 } 150 echo '</select>日' . "\n"; 151 ?> 152 </p> 153 <p> 154 電話番号: 155 <input type="text" name="phone_num" value="<?php echo htmlspecialchars($_SESSION['phone_num'], ENT_QUOTES, 'UTF-8'); ?>"> 156 </p> 157 <p> 158 住所: 159 <input type="text" name="street" value="<?php echo htmlspecialchars($_SESSION['street'], ENT_QUOTES, 'UTF-8'); ?>"> 160 </p> 161 <input type="submit" name="send" value="登録"> 162 </form> 163<? 164session_destroy(); 165} 166?> 167</body> 168</html>

check.php

PHP

1<?php 2 3session_start(); 4 5$_SESSION['employee_num'] = (int)$_POST['employee_num']; 6$_SESSION['employee_name'] = $_POST['employee_name']; 7$_SESSION['sexual'] = (int)$_POST['sexual']; 8$_SESSION['department'] = (int)$_POST['department']; 9$_SESSION['year'] = $_POST['year']; 10$_SESSION['month'] = $_POST['month']; 11$_SESSION['day'] = $_POST['day']; 12$_SESSION['phone_num'] = $_POST['phone_num']; 13$_SESSION['street'] = $_POST['street']; 14$_SESSION['error'] = array(); 15 16 17// エラーメッセージ 18if($_POST['employee_num'] === "") 19{ 20 $_SESSION['error'][] = "・社員番号は必ず入力してください。"; 21} 22if($_POST['employee_name'] === "") 23{ 24 $_SESSION['error'][] = "・氏名は必ず入力してください。"; 25} 26if($_POST['sexual'] === "") 27{ 28 $_SESSION['error'][] = "・性別が選択されていません。"; 29} 30 31if($_POST['department'] === "") 32{ 33 $_SESSION['error'][] = "・所属部署が選択されていません。"; 34} 35 36if($_POST['phone_num'] === "") 37{ 38 $_SESSION['error'][] = "・電話番号は必ず入力してください。"; 39} 40if($_POST['street'] === "") 41{ 42 $_SESSION['error'][] = "・住所は必ず入力してください。"; 43} 44 45 46if(isset($_SESSION['error']) && !empty($_SESSION['error'])) 47{ 48 // リダイレクト 49 header("location: http://localhost/employeephp/form.php"); // フォーム画面 50 exit(); 51} 52 53 unset($_SESSION['error']); 54 55 $year = $_SESSION['year']; 56 $month = $_SESSION['month']; 57 $day = $_SESSION['day']; 58 $select_month = sprintf('%02d', $month); 59 $select_day = sprintf('%02d', $day); 60 $total = $year.$select_month.$select_day; 61 $birthday = date("Y-m-d",strtotime($total)); 62 63 64 $form_birthday = date('Y年m月d日', strtotime($birthday)); 65 66 if ($_SESSION['sexual'] === 1) 67 { 68 $_SESSION['sexual'] = "男"; 69 } 70 elseif ($_SESSION['sexual'] === 2) 71 { 72 $_SESSION['sexual'] = "女"; 73 } 74 75 if ($_SESSION['department'] === 1) 76 { 77 $_SESSION['department'] = "システム部"; 78 } 79 elseif ($_SESSION['department'] === 2) 80 { 81 $_SESSION['department'] = "営業部"; 82 } 83 elseif ($_SESSION['department'] === 3) 84 { 85 $_SESSION['department'] = "総務部"; 86 } 87 88 ?> 89 <!DOCTYPE html> 90 <html lang = "ja"> 91 <head> 92 <meta charset="UTF-8"> 93 <title>確認</title> 94 </head> 95 <body> 96 <form action = "add.php" method="post"> 97 <? 98 99 // 確認画面 100 echo "社員番号:" . htmlspecialchars($_SESSION['employee_num'],ENT_QUOTES,'UTF-8') . "<br>\n"; 101 echo "氏名:" . htmlspecialchars($_SESSION['employee_name'],ENT_QUOTES,'UTF-8') . "<br>\n"; 102 echo "性別:" . htmlspecialchars($_SESSION['sexual'],ENT_QUOTES,'UTF-8') . "<br>\n"; 103 echo "所属部署:" . htmlspecialchars($_SESSION['department'],ENT_QUOTES,'UTF-8') . "<br>\n"; 104 echo "生年月日:" . htmlspecialchars($form_birthday,ENT_QUOTES,'UTF-8') . "<br>\n"; 105 echo "電話番号:" . htmlspecialchars($_SESSION['phone_num'],ENT_QUOTES,'UTF-8') . "<br>\n"; 106 echo "住所:" . htmlspecialchars($_SESSION['street'],ENT_QUOTES,'UTF-8') . "<br>\n"; 107 ?> 108 109<input type="submit" value="確認した上で送信"> 110</form> 111</body> 112</html>

試したこと

ページのフラグを立てて、セッションでほとんどは値の保持は出来たのですがどうしても生年月日の部分だけ値の保持の実装の仕方がわからない状況です。
どうか、ご教示お願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

PHP

1 生年月日: 2 <?php 3 echo '<select name="year">'. "\n"; 4 $start = date('Y'); 5 $end = date('Y') - 100; 6 for($i = $start; $i >= $end; $i--) 7 { 8 if ($_SESSION['year'] == $i) 9 { 10 echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n"; 11 } 12 else 13 { 14 echo '<option value="'.$i.'">' . $i .'</option>'. "\n"; 15 } 16 } 17 echo '</select>年' . "\n"; 18 echo '<select name="month">' . "\n"; 19 for ($i = 1; $i <= 12; $i++) 20 { 21 if ($_SESSION['month'] == $i) 22 { 23 echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n"; 24 } 25 else 26 { 27 echo '<option value="'.$i.'">' . $i .'</option>'. "\n"; 28 } 29 } 30 echo '</select>月' . "\n"; 31 echo '<select name="day">' . "\n"; 32 for ($i = 1; $i <= 31; $i++) 33 { 34 if ($_SESSION['day'] == $i) 35 { 36 echo '<option value="'.$i.'" selected>' . $i .'</option>'. "\n"; 37 } 38 else 39 { 40 echo '<option value="'.$i.'">' . $i .'</option>'. "\n"; 41 } 42 } 43 echo '</select>日' . "\n"; 44 ?>

$_SESSIONが$iだった時に$iをselectedにするという条件分岐を挟んで自己解決できました。

投稿2020/07/02 10:10

hj_petricall

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問