WHERE

2012-03-26 7 views
1

私はクイズアプリケーションを作ろうとしており、データベースから "n"個の質問を取り出す必要があります。私はまた、カテゴリまたは難しさのフィルタで結果をフィルタリングする必要があります。ユーザは、(例えば)カテゴリの選択をした場合WHERE

私は問題ありません。彼はすべてのカテゴリを望んでいる

$size = $_POST['param0']; 
$category = $_POST['param1']; 

$stmt = $db->prepare("SELECT * 
         FROM questions_fr 
         WHERE categories = :categories 
         LIMIT 0, $size"); 

$stmt->bindparam(":category", $category); 
$stmt->execute(); 

しかし、どのような場合には?

私のPHPファイルで1つのクエリを作成するようなことをすることはできますか?

$stmt = $db->prepare("SELECT * 
         FROM questions_fr 
         WHERE categories = * (here, select all the categories) 
         LIMIT 0, $size"); 

このような操作を行う必要がありますか?

(pseudocode) 
if ($category != "all_categories") 
{ 
    $stmt = $db->prepare("SELECT * 
          FROM questions_fr 
          WHERE categories = :categories 
          LIMIT 0, $size"); 
} 
else if ($category == "all_categories") 
{ 
    $stmt = $db->prepare("SELECT * 
          FROM questions_fr 
          LIMIT 0, $size"); 
} 
+1

うん、*それがぽっかりSQLインジェクションのセキュリティ上の危険であるとして – zerkms

+2

は '$のsize'には気をつけて渡されたパラメータに応じて*別のクエリを生成します。最初に正しい範囲内の有効な整数であることを確認してください。 – gahooa

+0

($ category == 'all_categories')? $ stmt = "":$ stmt = ""; とても洗練された – phpmeh

答えて

2

「すべてのカテゴリ」を選択すると、カテゴリ変数をワイルドカードに設定し、LIKE句を使用します。

if ($category == "all_categories") { 
    $category = '%'; 
} 

... 

SELECT * 
FROM questions_fr 
WHERE categories LIKE :categories 
LIMIT 0, $size 
1

別のパラメータを追加します。

SELECT * 
    FROM questions_fr 
    WHERE categories = :categories 
    OR 1 = :all_categories 
    LIMIT 0, $size 

すべてのカテゴリが必要な場合は、そのまま1としてください。

+0

'$ size'をプレースホルダにしてみませんか? – Bojangles

+0

@JamWaffles:* real *プレースホルダーの場合はiircが動作しません – zerkms