回答編集履歴

1

修正

2019/08/09 06:02

投稿

m.ts10806
m.ts10806

スコア80852

test CHANGED
@@ -7,3 +7,211 @@
7
7
  どう組もうとしているか分かりませんが、strposだと同じ名前を含む長い名前があったときを加味すると処理が難しくなるのでは?
8
8
 
9
9
  implode()で結合して保存したのでしたら取り出すときはexplode()で分解して対応されると良いです。
10
+
11
+
12
+
13
+ # 考え方など詳細追記
14
+
15
+
16
+
17
+ 入力画面基本形(DBに持った前提で配列にしています。)
18
+
19
+ ```php
20
+
21
+ $display_master = [
22
+
23
+ ['value'=>'user_name','label'=>'名前'],
24
+
25
+ ['value'=>'lastname','label'=>'名'],
26
+
27
+ ['value'=>'firstname','label'=>'苗字'],
28
+
29
+ ];
30
+
31
+
32
+
33
+ foreach($display_master as $row){
34
+
35
+ echo '<input type="checkbox" name="display[]" value="'.$row['value'].'">'.$row['label'].'<br />'.PHP_EOL;
36
+
37
+ }
38
+
39
+ ```
40
+
41
+ 登録されるデータ:`user_name/firstname`
42
+
43
+
44
+
45
+ 編集時画面
46
+
47
+ ```php
48
+
49
+ $display = 'user_name/firstname';
50
+
51
+ $display_array = explode('/',$display);
52
+
53
+
54
+
55
+ foreach($display_master as $row){
56
+
57
+ echo '<input type="checkbox" name="display[]" value="'.$row['value'].'"'.(in_array($row['value'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL;
58
+
59
+ }
60
+
61
+ ```
62
+
63
+
64
+
65
+ ただし。
66
+
67
+ もしかしたらここで定義している[value]の設定値も名前が変わる可能性があるかもしれません。
68
+
69
+ valueに設定するのは文字列ではなく数値、IDのようなもののほうが良い気がします。
70
+
71
+
72
+
73
+ 入力画面基本形
74
+
75
+ ```php
76
+
77
+ $display_master = [
78
+
79
+ ['id'=>1,'value'=>'user_name','label'=>'名前'],
80
+
81
+ ['id'=>2,'value'=>'lastname','label'=>'名'],
82
+
83
+ ['id'=>3,'value'=>'firstname','label'=>'苗字'],
84
+
85
+ ];
86
+
87
+
88
+
89
+ foreach($display_master as $row){
90
+
91
+ echo '<input type="checkbox" name="display[]" value="'.$row['id'].'">'.$row['label'].'<br />'.PHP_EOL;
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ 登録されるデータ:`1/3`
98
+
99
+
100
+
101
+ 編集時画面
102
+
103
+ ```php
104
+
105
+ $display = '1/3';
106
+
107
+ $display_array = explode('/',$display);
108
+
109
+
110
+
111
+ foreach($display_master as $row){
112
+
113
+ echo '<input type="checkbox" name="display[]" value="'.$row['id'].'"'.(in_array($row['id'],$display_array)?' checked':'').'>'.$row['label'].'<br />'.PHP_EOL;
114
+
115
+ }
116
+
117
+ ```
118
+
119
+
120
+
121
+ で、本題の「該当ユーザーにはその選択されたカラムしか表示しない」
122
+
123
+
124
+
125
+ マスタデータに対してSELECTを掛けるわけですがにこんな感じにします。
126
+
127
+ ```SQL
128
+
129
+ SELECT * FROM display_master where id in (1,3);
130
+
131
+ ```
132
+
133
+
134
+
135
+ こうすると「その人に設定したdisplay」のマスタ情報だけ取得できる という風になります。
136
+
137
+
138
+
139
+ ただ、
140
+
141
+ データベースをもう少しきちんと活用できれば、うまいことできなくもないです。
142
+
143
+ displayはあくまで「ユーザ個々の設定」なので、「1対多」の関係になります。
144
+
145
+ ユーザ1つに対して複数設定できるという点ですね。
146
+
147
+
148
+
149
+ なので、id, passwordなどと一緒に持つのではなく、
150
+
151
+ それすらも外に出して下記のように持っておくほうがexplode、implodeを考えなくても良くなります。
152
+
153
+
154
+
155
+ |user_id|display_id|
156
+
157
+ |--:|--:|
158
+
159
+ |1|1|
160
+
161
+ |1|3|
162
+
163
+ |2|1|
164
+
165
+ |3|1|
166
+
167
+ |3|2|
168
+
169
+ |3|3|
170
+
171
+
172
+
173
+ データの更新は毎回user_idで全delete全insertですね。
174
+
175
+
176
+
177
+ すると、下記のように同じデータがとってくれるようになります(未検証)
178
+
179
+ ```SQL
180
+
181
+ SELECT
182
+
183
+ *
184
+
185
+ FROM display_master
186
+
187
+ WHERE id IN (
188
+
189
+ SELECT
190
+
191
+ display_id
192
+
193
+ FROM user_display_data
194
+
195
+ WHERE user_id = 1
196
+
197
+ );
198
+
199
+ ```
200
+
201
+
202
+
203
+ データの関係図としては簡易に作るとこんな感じ。
204
+
205
+ ![イメージ説明](f9095d4011a2497e36da0c4a0183dbac.png)
206
+
207
+
208
+
209
+ userとuser_display_dataは1対多
210
+
211
+ user_display_dataとdisplay_masterは1対1になります。
212
+
213
+
214
+
215
+
216
+
217
+ どれがいいかは色々やってみてご自身で決めてください。