【发布时间】:2014-12-21 21:04:02
【问题描述】:
我正在尝试使用复选框来过滤搜索结果。在SELECT 查询中,AND 和OR 都需要使用,具体取决于选中的复选框数量和哪些复选框。这是 HTML:
<table>
<tr>
<th>Filter Results</th>
</tr>
<tr>
<td>By chipset manufacturer:</td>
<td><input name="by_amd" id="amdF" type="checkbox" value="1" />AMD</td>
<td><input name="by_ati" id="atiF" type="checkbox" value="2" />ATI</td>
<td><input name="by_nvid" id="nvidiaF" type="checkbox" value="3" />nVidia</td>
</tr>
<tr>
<td>By year released:</td>
<td><input name="by_2014" id="2014F" type="checkbox" value="2014" />2014</td>
<td><input name="by_2013" id="2013F" type="checkbox" value="2013" />2013</td>
<td><input name="by_2012" id="2012F" type="checkbox" value="2012" />2012</td>
<td><input name="by_2011" id="2011F" type="checkbox" value="2011" />2011</td>
</tr>
</table>
还有 PHP:
// create base SELECT query
$select = 'SELECT GPUProductName, GPUChip, GPUReleaseDate, GPUBus, GPUMemory, GPUClock, GPUMemClock, GPUAddStats';
$from = ' FROM GPU';
$where = ' WHERE TRUE';
// create search filters
$opts = isset($_POST['filterOpts']) ? $_POST['filterOpts'] : array('');
// By chipset manufacturer
if (in_array("by_amd", $opts)){
$where .= " AND CMid = 1";
}
if (in_array("by_ati", $opts)){
$where .= " AND CMid = 2";
}
if (in_array("by_nvid", $opts)){
$where .= " AND CMid = 3";
}
// by release year
if (in_array("by_2014", $opts)){
$where .= " AND YEAR(GPUReleaseDate)='2014'";
}
// build complete SELECT query
$query = $select . $from . $where;
return $query;
如果您选择“by ATI”和“by AMD”,则 SELECT 语句应分别为 WHERE CMid = 2 OR CMid = 1。如果您随后添加“到 2014 年”,则 SELECT 语句应为 WHERE YEAR(GPUReleaseYear) = 2014 AND CMid = 2 OR CMid = 1。基本上,从同一类别(可以这么说)中挑选的过滤器应该用 OR 连接,从不同类别中挑选的过滤器应该用 AND 连接。在 PHP 中,我如何根据从相同和/或不同类别中选中的复选框来创建正确的 SELECT 语句?
【问题讨论】:
-
只是所有 AND 在 cmid 到 OR 它应该按预期工作。 WHERE TRUE OR cond1 OR cond2 OR cond3 AND year .. 都需要正确。
-
它没有,因为语句读取
WHERE TRUE OR CMid = 1 OR CMid = 2。这意味着无论使用什么过滤器,它都会从表中提取所有内容。 -
OR 语句应放在括号内,例如; WHERE (CMid=1 OR CMid=2) AND (YEAR(GPUReleaseYear)=2014 OR YEAR(GPUReleaseYear)=2012)
标签: php mysql ajax checkbox filtering