teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

調整

2018/07/24 12:10

投稿

yambejp
yambejp

スコア117875

answer CHANGED
@@ -90,11 +90,11 @@
90
90
  <input type="checkbox" name="class[]" value="A">A
91
91
  <input type="checkbox" name="class[]" value="B">B
92
92
  <input type="checkbox" name="class[]" value="C">C<br>
93
- <input type="checkbox" name = subject[] value = "janpanese">国語<br>
93
+ <input type="checkbox" name ="subject[]" value = "janpanese">国語<br>
94
- <input type="checkbox" name = subject[] value = "math">数学<br>
94
+ <input type="checkbox" name ="subject[]" value = "math">数学<br>
95
- <input type="checkbox" name = subject[] value = "science">理科<br>
95
+ <input type="checkbox" name ="subject[]" value = "science">理科<br>
96
- <input type="checkbox" name = subject[] value = "social">社会<br>
96
+ <input type="checkbox" name ="subject[]" value = "social">社会<br>
97
- <input type="checkbox" name = subject[] value = "english">英語<br>
97
+ <input type="checkbox" name ="subject[]" value = "english">英語<br>
98
98
  <input type="submit" name="search" value="検索"><br>
99
99
  <input type="submit" name="back" value="戻る"><br>
100
100
  </form>

3

組み込み

2018/07/24 12:10

投稿

yambejp
yambejp

スコア117875

answer CHANGED
@@ -43,4 +43,60 @@
43
43
  <input type="submit" name="search" value="検索"><br>
44
44
  <input type="submit" name="back" value="戻る"><br>
45
45
  </form>
46
+ ```
47
+
48
+ # 組み込み
49
+ 一応ざっくり組み込んでみました
50
+ 環境にあわせて調整してください
51
+ ```PHP
52
+ <?PHP
53
+ $class=filter_input(INPUT_POST,"class",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
54
+ $subject=filter_input(INPUT_POST,"subject",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
55
+
56
+ $sql ="select students.name, classes.name FROM students ";
57
+ $sql.="JOIN classes ON students.class_id = classes.id ";
58
+ $sql.="JOIN scores ON students.id = scores.student_id ";
59
+ $sql.="WHERE 1 ";
60
+ $params=[];
61
+ $data=[];
62
+ if(!is_null($class)){
63
+ $sql.="and classes.name in (".implode(",",array_fill(0,count($class),"?")).") ";
64
+ if(!isset($params[0])) $params[0]="";
65
+ $params[0].=str_repeat( 's', count($class));
66
+ $data=array_merge($data,$class);
67
+ }
68
+ if(!is_null($subject)){
69
+ $sql.="and classes.name in (".implode(",",array_fill(0,count($subject),"?")).") ";
70
+ if(!isset($params[0])) $params[0]="";
71
+ $params[0].=str_repeat( 's', count($subject));
72
+ $data=array_merge($data,$subject);
73
+ }
74
+ print $sql;
75
+ print_r($params);
76
+
77
+ $mysqli = new mysqli("localhost", "myuser", "mypass", "mydb");
78
+ $stmp=$mysqli->prepare($sql);
79
+ foreach ($data as $key=>$val){
80
+ $params[] = &$data[$key];
81
+ }
82
+ call_user_func_array([$stmt, 'bind_param'], $params);
83
+ $stmt->execute();
84
+ $res = $stmt->get_result();
85
+ $rows=$res->fetch_all(MYSQLI_ASSOC);
86
+ print_r($rows);
87
+
88
+ ?>
89
+ <form method = "post">
90
+ <input type="checkbox" name="class[]" value="A">A
91
+ <input type="checkbox" name="class[]" value="B">B
92
+ <input type="checkbox" name="class[]" value="C">C<br>
93
+ <input type="checkbox" name = subject[] value = "janpanese">国語<br>
94
+ <input type="checkbox" name = subject[] value = "math">数学<br>
95
+ <input type="checkbox" name = subject[] value = "science">理科<br>
96
+ <input type="checkbox" name = subject[] value = "social">社会<br>
97
+ <input type="checkbox" name = subject[] value = "english">英語<br>
98
+ <input type="submit" name="search" value="検索"><br>
99
+ <input type="submit" name="back" value="戻る"><br>
100
+ </form>
101
+
46
102
  ```

2

調整

2018/07/24 05:54

投稿

yambejp
yambejp

スコア117875

answer CHANGED
@@ -35,11 +35,11 @@
35
35
  <input type="checkbox" name="class[]" value="A">A
36
36
  <input type="checkbox" name="class[]" value="B">B
37
37
  <input type="checkbox" name="class[]" value="C">C<br>
38
- <input type="checkbox" name = subject[] value = "janpanese">国語<br>
38
+ <input type="checkbox" name ="subject[]" value="janpanese">国語<br>
39
- <input type="checkbox" name = subject[] value = "math">数学<br>
39
+ <input type="checkbox" name ="subject[]" value="math">数学<br>
40
- <input type="checkbox" name = subject[] value = "science">理科<br>
40
+ <input type="checkbox" name ="subject[]" value="science">理科<br>
41
- <input type="checkbox" name = subject[] value = "social">社会<br>
41
+ <input type="checkbox" name ="subject[]" value="social">社会<br>
42
- <input type="checkbox" name = subject[] value = "english">英語<br>
42
+ <input type="checkbox" name ="subject[]" value="english">英語<br>
43
43
  <input type="submit" name="search" value="検索"><br>
44
44
  <input type="submit" name="back" value="戻る"><br>
45
45
  </form>

1

データ

2018/07/24 04:07

投稿

yambejp
yambejp

スコア117875

answer CHANGED
@@ -8,4 +8,39 @@
8
8
  なおmysqliでインジェクション対策なしのSQLを発行しているようですが
9
9
  あまり得策とはいえません。
10
10
  mysqliにも多少煩雑ですがprepare処理がありますので、そちらを使うか
11
- pdoでparepare処理することをおすすめします
11
+ pdoでparepare処理することをおすすめします
12
+
13
+ # 参考
14
+ プレースホルダの基本データ
15
+ ```PHP
16
+ <?PHP
17
+ $class=filter_input(INPUT_POST,"class",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
18
+ $subject=filter_input(INPUT_POST,"subject",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
19
+ $sql ="select students.name, classes.name FROM students ";
20
+ $sql.="JOIN classes ON students.class_id = classes.id ";
21
+ $sql.="JOIN scores ON students.id = scores.student_id ";
22
+ $sql.="WHERE 1 ";
23
+ $params=[];
24
+ if(!is_null($class)){
25
+ $sql.="and classes.name in (".implode(",",array_fill(0,count($class),"?")).") ";
26
+ $params_class =[str_repeat( 's', count($class))];
27
+ $params=array_merge($params,$params_class);
28
+ }
29
+ if(!is_null($subject)){
30
+ $sql.="and classes.name in (".implode(",",array_fill(0,count($subject),"?")).") ";
31
+ }
32
+ print $sql;
33
+ ?>
34
+ <form method = "post">
35
+ <input type="checkbox" name="class[]" value="A">A
36
+ <input type="checkbox" name="class[]" value="B">B
37
+ <input type="checkbox" name="class[]" value="C">C<br>
38
+ <input type="checkbox" name = subject[] value = "janpanese">国語<br>
39
+ <input type="checkbox" name = subject[] value = "math">数学<br>
40
+ <input type="checkbox" name = subject[] value = "science">理科<br>
41
+ <input type="checkbox" name = subject[] value = "social">社会<br>
42
+ <input type="checkbox" name = subject[] value = "english">英語<br>
43
+ <input type="submit" name="search" value="検索"><br>
44
+ <input type="submit" name="back" value="戻る"><br>
45
+ </form>
46
+ ```