2012-03-26 78 views
1

我正在嘗試做一個測驗應用程序,我需要從數據庫中檢索「n」個問題。我還需要使用類別或難度過濾器來過濾結果。在PHP中選擇與條款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文件中只有一個查詢?

$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

沒錯,*根據傳遞 – zerkms 2012-03-26 22:50:22

+2

當心'$ size',因爲它是一個敞開的SQL注入安全隱患的參數生成*不同的查詢。建議您確保它是首先在正確範圍內的有效整數。 – gahooa 2012-03-26 22:51:46

+0

($ category =='all_categories')? $ stmt =「」:$ stmt =「」; 非常清潔 – phpmeh 2012-03-26 22:52:42

回答

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 2012-03-26 23:53:29

+0

@JamWaffles:iirc在*真實*佔位符的情況下不起作用 – zerkms 2012-03-27 01:23:17