/ / Alterando a consulta mysql baseada em variáveis ​​- php, mysql, variáveis

Alterando a consulta mysql com base em variável - php, mysql, variáveis

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 № 1

Tente 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)