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

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

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

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

Q&A

1回答

528閲覧

checkboxで選択した値をデータベースに登録し、その値をもとにカラムを表示させたい(アイディアをください)

chiyotaikai

総合スコア2

PHP

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

0グッド

0クリップ

投稿2019/08/09 04:55

前提・実現したいこと

phpでユーザー管理画面のようなものを作っています。
登録画面にて、ユーザーID・パスワード、表示するカラムが選択できるようにして
該当ユーザーにはその選択されたカラムしか表示しないものを作りたいです。

DBのテーブル①には「ID」・「パスワード」・「表示するカラム」、
DBのテーブル②には「ID」・「名前」・「名」「苗字」・・・「電話番号」の情報がそれぞれカラムで入っています。

php

1<!--追加登録画面(tsuika.php)--> 2<!DOCTYPE html> 3<html> 4<head> 5 <title>DB登録</title> 6</head> 7<body> 8 9<h1 align="center">DB</h1> 10 11<h2>[追加]</h2> 12<form action="touroku.php" method="POST"> 13 <p> 14 ID15 <input type="text" name="id" size="20" > 16 パスワード: 17 <input type="text" name="password" size="20" > 18 19 <p> 20 表示するカラム:<br> 21 <input type="checkbox" name="display[]" value="username">名前 22 <input type="checkbox" name="display[]" value="lastname">23 <input type="checkbox" name="display[]" value="firstname">苗字 24 <input type="checkbox" name="display[]" value="lastname_kana">メイ 25 <input type="checkbox" name="display[]" value="firstname_kana">ミョウジ 26 <input type="checkbox" name="display[]" value="address">メールアドレス 27 <input type="checkbox" name="display[]" value="tel">電話番号<br></p> 28 <input type="submit" value="追加"> 29 <input type="reset" value="修正"> 30</form> 31 32 33</body> 34</html>

上記でID・パスワードなどを登録して表示するカラムを選択する

php

1<!--登録画面(touroku.php)--> 2<!DOCTYPE html> 3<html> 4<head> 5 <title></title> 6</head> 7<body> 8 9<h1 align="center">【DB】</h1> 10 11<h2>[登録完了]</h2> 12 13 14<p>追加登録が完了しました</p> 15 16 17<?php 18 19 $id = $_POST['id']; 20 $password = $_POST['password']; 21 $display = $_POST['display']; 22 $display = implode("/", $display); 23 24try{ 25 $pdo = new PDO("mysql:host=localhost; dbname=db; charset=utf8", "root", ""); 26 $stmt = $pdo->prepare("INSERT INTO table(id, password, display) VALUES(:id, :password, :display)"); 27 $stmt ->bindparam(':id',$id,PDO::PARAM_STR); 28 $stmt ->bindparam(':password',$password,PDO::PARAM_STR); 29 $stmt ->bindparam(':display',$display, PDO::PARAM_STR); 30 $stmt->execute(); 31 32}catch (Exception $e){ 33 exit('データベース接続失敗。' . $e ->getMessage()); 34} 35 36 37?> 38</body> 39</html>

上記でDBにID・パスワード、表示するカラムを格納します。
その際、表示するカラムは配列から文字列にして「/」で仕切っています。

試したこと

$display(文字列)の中身をstrposにて確認し、
trueであれば表示、なければ非表示というかたちでif文で分岐させていこうかと思いましたが
今後、$displayの中身を増やしていきたいと考えたときに効率が悪いのではないかと思いました。

phpを勉強はじめたばかりで、というのはいいわけではあるかとは思いますが
効率の良い・また簡潔なやり方をご教示いただきたく質問させていただきます。

いいアイディアをぜひ教えてください。宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

display自体もマスタデータとして持っておくと良いのではと。
で、checkbox作る際もそのマスタデータから作る。

どう組もうとしているか分かりませんが、strposだと同じ名前を含む長い名前があったときを加味すると処理が難しくなるのでは?
implode()で結合して保存したのでしたら取り出すときはexplode()で分解して対応されると良いです。

考え方など詳細追記

入力画面基本形(DBに持った前提で配列にしています。)

php

1$display_master = [ 2 ['value'=>'user_name','label'=>'名前'], 3 ['value'=>'lastname','label'=>'名'], 4 ['value'=>'firstname','label'=>'苗字'], 5]; 6 7foreach($display_master as $row){ 8 echo '<input type="checkbox" name="display[]" value="'.$row['value'].'">'.$row['label'].'<br />'.PHP_EOL; 9}

登録されるデータ:user_name/firstname

編集時画面

php

1$display = 'user_name/firstname'; 2$display_array = explode('/',$display); 3 4foreach($display_master as $row){ 5 echo '<input type="checkbox" name="display[]" value="'.$row['value'].'"'.(in_array($row['value'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL; 6}

ただし。
もしかしたらここで定義している[value]の設定値も名前が変わる可能性があるかもしれません。
valueに設定するのは文字列ではなく数値、IDのようなもののほうが良い気がします。

入力画面基本形

php

1$display_master = [ 2 ['id'=>1,'value'=>'user_name','label'=>'名前'], 3 ['id'=>2,'value'=>'lastname','label'=>'名'], 4 ['id'=>3,'value'=>'firstname','label'=>'苗字'], 5]; 6 7foreach($display_master as $row){ 8 echo '<input type="checkbox" name="display[]" value="'.$row['id'].'">'.$row['label'].'<br />'.PHP_EOL; 9}

登録されるデータ:1/3

編集時画面

php

1$display = '1/3'; 2$display_array = explode('/',$display); 3 4foreach($display_master as $row){ 5 echo '<input type="checkbox" name="display[]" value="'.$row['id'].'"'.(in_array($row['id'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL; 6}

で、本題の「該当ユーザーにはその選択されたカラムしか表示しない」

マスタデータに対してSELECTを掛けるわけですがにこんな感じにします。

SQL

1SELECT * FROM display_master where id in (1,3);

こうすると「その人に設定したdisplay」のマスタ情報だけ取得できる という風になります。

ただ、
データベースをもう少しきちんと活用できれば、うまいことできなくもないです。
displayはあくまで「ユーザ個々の設定」なので、「1対多」の関係になります。
ユーザ1つに対して複数設定できるという点ですね。

なので、id, passwordなどと一緒に持つのではなく、
それすらも外に出して下記のように持っておくほうがexplode、implodeを考えなくても良くなります。

user_iddisplay_id
11
13
21
31
32
33

データの更新は毎回user_idで全delete全insertですね。

すると、下記のように同じデータがとってくれるようになります(未検証)

SQL

1SELECT 2 * 3FROM display_master 4 WHERE id IN ( 5 SELECT 6 display_id 7 FROM user_display_data 8 WHERE user_id = 1 9);

データの関係図としては簡易に作るとこんな感じ。
イメージ説明

userとuser_display_dataは1対多
user_display_dataとdisplay_masterは1対1になります。

どれがいいかは色々やってみてご自身で決めてください。

投稿2019/08/09 05:05

編集2019/08/09 06:02
m.ts10806

総合スコア80850

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

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

chiyotaikai

2019/08/09 05:28

m.ts10806様 早速のご回答ありがとうございます。 >strposだと同じ名前を含む長い名前があったときを加味すると処理が難しくなるのでは? 「name」がかぶるものが多々ありますので、strposはやはりおかしいですね。
chiyotaikai

2019/08/09 05:29

>display自体もマスタデータとして持っておくと良いのではと。 で、checkbox作る際もそのマスタデータから作る。 すみません、こちらについてもう少し噛み砕いたご説明をいただくことは可能でしょうか?
m.ts10806

2019/08/09 05:30

displayも増えたり減ったりがあるのでしたら、データベースに持っておいたほうが良いという考え方です。(面倒なら連想配列でも良いですけど)
chiyotaikai

2019/08/09 05:31

連発申し訳ございません。 「explode」で配列に戻して、、のその先でどのようにデータベースから引っ張る形を取れるかで悩みましてstrposにたどり着き、現在に至ります。
m.ts10806

2019/08/09 06:03

ざっと追記しました。 explode()するパターンと そもそも保存時も別テーブルにするパターンです
chiyotaikai

2019/08/09 06:33

m.ts10806様 ご回答ありがとうございます。お手数をお掛け致しました。 まだ全体を理解といいますか把握しきれておりません。 申し訳ありません。 検証してまたコメントさせていただきます。
m.ts10806

2019/08/09 06:34

1つ1つ確かめていくと良いです(そのために基本形からバラしてコード書いています)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問