回答編集履歴

1

追記追加

2017/06/06 03:12

投稿

退会済みユーザー
test CHANGED
@@ -13,3 +13,65 @@
13
13
  AND (@type='ALL' OR type=@type)
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+ ----- 2017/6/6 12:11 追記 -----
20
+
21
+
22
+
23
+ 2017/06/06 11:53 の私のコメントで「詳しくは回答欄に書いておきます」と書きましたが、それを以下に書いておきます。
24
+
25
+
26
+
27
+ まず基本的な話として、パラメータ化クエリというのをご存知でしょうか? 
28
+
29
+
30
+
31
+ 以下の記事によると PHP + MySQL でも使えるはずですので、SQL インジェクション防止とパフォーマンス向上のため必ず使うようにしてください。
32
+
33
+
34
+
35
+ パラメータ化クエリ
36
+
37
+ [**http://use-the-index-luke.com/ja/sql/where-clause/bind-parameters**](http://use-the-index-luke.com/ja/sql/where-clause/bind-parameters)
38
+
39
+
40
+
41
+ 質問者さんが最初の質問に書かれたコードを見ると、POST されてきたユーザー入力で SELECT クエリの文字列を組み立てているように見えますが、もしそうだとすると、それは SQL インジェクションしてくださいと言っているようなものです。なので、まずパラメータ化クエリを使うようにしてください。
42
+
43
+
44
+
45
+ パラメータ化クエリに関する知識が十分でないと話が通じにくいのですが、とりあえず @ のことについて書いておきます。
46
+
47
+
48
+
49
+ コメントにも書きましたが、パラメータ化の際のプレースホルダの命名規則には DB やプロバイダによっていろいろ違いがあり、頭に @ を付けるのは MySQL + Connector/NET を使った場合の規則です。
50
+
51
+
52
+
53
+ 上に紹介した記事によると、PHP + MySQL では命名規則が異なるようで、疑問符 (?) で指定される位置パラメータマーカーが使用されるそうです。
54
+
55
+
56
+
57
+ なので、WHERE 句は、上に書いた @maker や @type のような名前付きパラメータではなくて、位置パラメータマーカー (?) を使って、
58
+
59
+
60
+
61
+ ```
62
+
63
+ WHERE (?='ALL' OR maker=?)
64
+
65
+ AND (?='ALL' OR type=?)
66
+
67
+ ```
68
+
69
+
70
+
71
+ のようになると思います。
72
+
73
+
74
+
75
+ **注:PHP の開発環境を持っていないので未検証・未確認です。**もしハズレだったらすみません。
76
+
77
+