所以我正在制作基于点击的搜索工具。没有什么花哨的东西,只要你从所有可用的类别中选择至少一件东西,它就会很好用。我想更改它,以便没有强制类别可供选择,所以如果我只想从类别cpu
中选择,那么这也会产生结果。
这就是我的意见:
<form action="search.php" method="GET">
<input value="i3" name="cpu[]" type="checkbox">i3
<input value="i5" name="cpu[]" type="checkbox">i5 <br>
<input value="4gb" name="ram[]" type="checkbox">4gb
<input value="8gb" name="ram[]" type="checkbox">8gb<br>
<input value="1tb" name="storage[]" type="checkbox">1TB
<input value="500gb" name="storage[]" type="checkbox">500GB<br>
<input type="submit" value="search" class="submit" />
这是收集点击复选框的部分(我省略了cpu和ram部分,因为它相同):
if(isset($_GET['storage'])){
if (is_array($_GET['storage'])) {
foreach($_GET['storage'] as $storage_value){
$storage_term = trim($storage_value);
$storage_term_array[] = $storage_term;
if (!empty($storage_term)) {
$storage_bits[] = "`storage` LIKE '%$storage_term%'";
}
} } }
else $storage_bits="0";
mysql_query
就是这样:
$res=mysql_query("SELECT * FROM laptop WHERE
(".implode(' OR ', $cpu_bits).")
AND (".implode(' OR ', $ram_bits).")
AND (".implode(' OR ', $storage_bits).")
AND visibility=1");
这就是它的回报:
(`cpu` LIKE '%i5%') AND (`ram` LIKE '%8gb%') AND (`storage` LIKE '%1tb%' OR `storage` LIKE '%500gb%')
这是正在运行的代码,但正如我之前所说,您需要为每个类别选择至少1个复选框。如何完全排除我们说AND (".implode(' OR ', $storage_bits)."
部分if $storage_bits="0"
?
到目前为止,我对case
$res=mysql_query("SELECT * FROM laptop WHERE
(".implode(' OR ', $cpu_bits).")
AND (".implode(' OR ', $ram_bits).")
(case when ($storage_bits=0) THEN 'AND 1=1' ELSE 'AND (".implode(' OR ', $storage_bits)."' END )
AND visibility=1");
即使IF
对我有效。
$res=mysql_query("SELECT * FROM laptop WHERE
(".implode(' OR ', $cpu_bits).")
AND (".implode(' OR ', $ram_bits).")
IF($storage_bits=0,'1=1','AND (".implode(' OR ', $storage_bits).")
AND visibility=1");
它没有给我任何语法错误,它只是没有给出结果。是什么赋予了?我觉得我错过了一些引号或同样可怜的东西,但我似乎无法绕过它。谢谢!
答案 0 :(得分:1)
$query_parts = array();
foreach($_GET as $column => $values) {
$query_parts[] = '(' . $column . ' LIKE \'%' . implode(' OR ' . $column . ' LIKE \'%', $values) . '%\')';
}
$query = 'SELECT * FROM Laptop';
if(count($query) > 0) {
$query .= ' WHERE ' . implode(' AND ', $query_parts);
}
var_dump($query);
/?cpu%5B%5D=i3&cpu%5B%5D=i5&ram%5B%5D=4gb
结果string 'SELECT * FROM Laptop WHERE (cpu LIKE '%i3 OR cpu LIKE '%i5%') AND (ram LIKE '%4gb%')' (length=85)
答案 1 :(得分:1)
试试这个:
$whereClause = "WHERE visibility = 1";
if($cpu_bits != '0'){
$whereClause .= " AND (".implode(' OR ', $cpu_bits).")";
}
if($ram_bits != '0'){
$whereClause .= " AND (".implode(' OR ', $ram_bits).")";
}
if($storage_bits != '0'){
$whereClause .= "AND (".implode(' OR ', $storage_bits).")";
}
$res=mysql_query("SELECT * FROM laptop".$whereClause);
执行此操作,您将阻止空字段进入where子句。