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

回答編集履歴

1

追記追加

2017/06/06 03:12

投稿

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