Então, estou fazendo uma ferramenta de pesquisa baseada em cliques. Nada extravagante e funciona muito bem, desde que você escolha pelo menos uma coisa em todas as categorias disponíveis. Eu quero alterá-lo para que não haja categorias obrigatórias para escolher, por isso, se eu só quiser escolher da categoria cpu
, então isso daria resultados também.
Isto é o que eu tenho como entrada:
<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" />
Esta é a parte que reúne as caixas de seleção clicadas (deixei de fora as peças da CPU e da memória RAM, já que é o mesmo):
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";
E a mysql_query
vai assim:
$res=mysql_query("SELECT * FROM laptop WHERE
(".implode(" OR ", $cpu_bits).")
AND (".implode(" OR ", $ram_bits).")
AND (".implode(" OR ", $storage_bits).")
AND visibility=1");
É isso que ele retorna:
(`cpu` LIKE "%i5%") AND (`ram` LIKE "%8gb%") AND (`storage` LIKE "%1tb%" OR `storage` LIKE "%500gb%")
Este é o código que está funcionando, mas como eu disse antes, você precisa escolher pelo menos uma caixa de seleção por categoria. Como faço para excluir completamente vamos dizer o AND (".implode(" OR ", $storage_bits)."
parte if $storage_bits="0"
?
Até agora eu não tive sorte com 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");
E nem mesmo o IF
está trabalhando para mim.
$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");
Não me dá nenhum erro de sintaxe, apenasnão dá resultados. O que dá? Eu sinto que estou faltando algumas aspas ou algo similarmente lamentável, mas eu simplesmente não consigo envolver minha cabeça em torno dele. Obrigado!
Respostas:
1 para resposta № 1Tente isto:
$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);
Fazendo isso, você está evitando campos vazios para ir lá onde cláusula.
1 para resposta № 2
$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);
A consulta para /?cpu%5B%5D=i3&cpu%5B%5D=i5&ram%5B%5D=4gb
Resultados string "SELECT * FROM Laptop WHERE (cpu LIKE "%i3 OR cpu LIKE "%i5%") AND (ram LIKE "%4gb%")" (length=85)