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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

Q&A

解決済

1回答

1420閲覧

バリデーションに引っ掛かったらカテゴリーを選択してくださいが消えてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

0グッド

0クリップ

投稿2021/05/04 08:33

前提・実現したいこと

バリデーションに引っ掛かったらカテゴリーを選択してくださいが消えてしまうので、
バリデーションに引っ掛かっても「カテゴリーを選択してください」が消えないようにしたい。

以下のようにカテゴリーボックスを作成してます。
イメージ説明

現在の状況だと、バリデーションに引っ掛かったら「カテゴリーを選択してください」が消えてしまいます。
イメージ説明

なので、他のところでバリデーションに引っ掛かっても「カテゴリーを選択してください」が消えないようにしたい。

なお、カテゴリーを選択した上で他のバリデーションにひっかかる場合は以下のようにカテゴリーが選択された状態なので実装上問題ないです。
イメージ説明

該当のソースコード

post.php

php

1session_start(); 2require_once(ROOT_PATH .'/Models/Post.php'); 3require_once(ROOT_PATH .'function.php'); 4ini_set('display_errors', "On"); 5$obj = new Post(); 6 7// ログインしているユーザid 8$company_id = $_SESSION['login_company']['id']; 9 10$err = []; 11 12 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 13 14 $title = filter_input(INPUT_POST, 'title'); 15 $text = filter_input(INPUT_POST, 'text'); 16 $tags = filter_input(INPUT_POST, 'tags'); 17 $category = filter_input(INPUT_POST, 'category'); 18 $price = filter_input(INPUT_POST, 'price'); 19 20 if(empty($category)) { 21 $err['category'] = "カテゴリーを以下のセレクトボックスから選択してください"; 22 } 23 24 // エラーがなければ、DBにデータを保存し、リスト一覧にページ遷移 25 if(count($err) === 0) { 26 $j_tags = implode('/', array_column(json_decode($_POST['tags']), 'value')); 27 $result = $obj->createList($company_id,$_POST,$save_path, $j_tags); 28 $_SESSION['list_msg'] = "投稿が完了しました!"; 29 header('Location: index.php'); 30 exit; 31 } 32 <!-- カテゴリー --> 33 <h6 id="p-category"><label for="kome"><font color="red">*</font></label>カテゴリーを選択してください</h6> 34 <?php if(isset($err['category'])): ?> 35 <p class="err_one"><font color="red"><?php echo $err['category'] ?></font></p> 36 <?php endif; ?> 37 <select class="form-select" id="category-select" name="category"> 38 <?php if(isset($_POST['category'])): ?> 39 <option selected><?php echo h($obj->setCategoryName($category)); ?></option> 40 <?php else: ?> 41 <option selected value="0">カテゴリーを選択してください</option> 42 <?php endif; ?> 43 <option value="1">求人</option> 44 <option value="2">人材育成・研修</option> 45 <option value="3">集客・マーケティング</option> 46 <option value="4">Webサイト制作</option> 47 <option value="5">Webコンテンツ制作</option> 48 <option value="6">イラスト</option> 49 <option value="7">営業・コールセンター代行</option> 50 <option value="8">ビジネス相談・経営コンサル</option> 51 <option value="9">士業(税理士・行政書士など)</option> 52 <option value="10">翻訳・語学</option> 53 <option value="11">クリーニング</option> 54 <option value="12">音楽・ナレーション</option> 55 <option value="13">その他</option> 56 </select>

Post.php

/** カテゴリーIDからカテゴリー名に変換 * @param int $category_id * @return string */ public function setCategoryName($category) { if($category === '1') { return '求人'; } elseif($category === '2') { return '人材育成・研修'; } elseif($category === '3') { return '集客・マーケティング'; } elseif($category === '4') { return 'Webサイト制作'; } elseif($category === '5') { return 'Webコンテンツ制作'; } elseif($category === '6') { return 'イラスト'; } elseif($category === '7') { return '営業・コールセンター代行'; } elseif($category === '8') { return 'ビジネス相談・経営コンサル'; } elseif($category === '9') { return '士業(税理士・行政書士など)'; } elseif($category === '10') { return '翻訳・語学'; } elseif($category === '11') { return 'クリーニング'; } elseif($category === '12') { return '音楽・ナレーション'; } elseif($category === '13') { return 'その他'; } }

試したこと

以下の部分を削除し、デフォルトで最初からカテゴリーを選択している状態にしてみた。

<option selected value="0">カテゴリーを選択してください</option>

バリデーションに引っ掛かっても1回目はデータがデフォルトの物が送信されるが、2回ひっかかると空欄になってしまう。

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

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

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

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

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

itagagaki

2021/05/04 08:58

filter_inputの内容も示していただけますか?
退会済みユーザー

退会済みユーザー

2021/05/04 09:17

filter_inputの内容とは、他のバリデーションメッセージ等のことでしょうか?
itagagaki

2021/05/04 09:19

あ、いや、なんでもないです。すみません。
guest

回答1

0

ベストアンサー

setCategoryName()に0だったときの選択肢がないです。

というか、selected属性をつければ別に一番上にある必要はないので、
そもそものセレクトボックスの作り方間違えてます。
今の実装だとバリデーション掛からなかったときに同じvalueが2つ並ぶことになりますよ。

同じ情報を複数個所に持つメンテナンス性の悪さも加味すると、配列なりデータベースで設定情報持っておいて、それぞれに一致するかどうかでselected出力するだけでいいのでは。

php

1<?php 2 3$selectlist = ["選択して","a","b","c"]; 4$category = filter_input(INPUT_POST, 'category'); 5 6 7 8echo '<select>'.PHP_EOL; 9foreach($selectlist as $n=>$v){ 10 echo '<option value="'.$n.'"'.(($category==$n)?' selected':'').'>'.$v.'</option>'.PHP_EOL; 11} 12echo '</select>'.PHP_EOL; 13 14 15 16

投稿2021/05/04 09:04

m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2021/05/04 09:17

ご回答ありがとうございます。 このようなやり方もあるのですね。勉強になります。 実装してみてわからない点があればまたご質問させていただきます。
m.ts10806

2021/05/04 09:27

本件の直接の原因は1行目でこたえていますが、そちらはどうでしょうか。
退会済みユーザー

退会済みユーザー

2021/05/04 11:33

結論、2回目バリデーションに引っ掛かったときに空欄になってしまいます。 elseif($category === '0') { return 'カテゴリーを選択してください。'; } setCategoryNameにvalueが0だった場合に上記追加してやってみたのですが、1回目バリデーション引っ掛かったときは問題なくカテゴリーを選択してくださいが表示されるんですが、2回目以降バリデーションにひっかかると空欄になります。
m.ts10806

2021/05/04 20:20

デバッグしてください。 書いたとおりにしか動きませんので。 回答読んでないのかもしれませんが、下記も少なからず影響しているはずです。 >今の実装だとバリデーション掛からなかったときに同じvalueが2つ並ぶことになりますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問