2012-03-26 62 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