Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP:Pesquisar banco de dados mysql usando várias listas suspensas de seleção?

$clause = " OR ";//Change  to OR after 1st WHERE

O operador OR acima fará com que seus critérios where selecionem um registro, mesmo que 1 palavra-chave corresponda ao campo attr. Altere-o para " AND " para que todas as palavras-chave sejam aplicadas.

Além disso, ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" critério parece se aplicar a todas as palavras-chave, então este critério deve ser adicionado uma vez, não em cada iteração do loop. $currentproduct =$_POST['product']; linha também deve ser movida para frente do loop.

EDIT:para refletir a alteração do opreator para AND e não ter nenhuma linha retornada.
...ATTRIBUTES.attr LIKE BINARY '$c'...

Se não houver curingas em $c, o critério acima exigirá que a palavra corresponda ao campo attr como se o operador =tivesse sido usado, o que é improvável de acontecer. Os curingas devem ser incluídos na pesquisa:'%$c%'

Além disso, alguma proteção contra injeção de sql também seria bom.

EDIT2:Se cada atributo for armazenado em seu próprio registro, isso complica um pouco as coisas, já que os critérios where são avaliados em relação a um único registro, não a uma coleção deles.

Eu lhe darei um exemplo de comando select, mas você terá que incorporá-lo ao seu código php.
select product_details.* FROM product_details INNER JOIN
    (select product_details.id, count(ATTRIBUTES.id) as total
     FROM `product_details`
     INNER JOIN `ATTRIBUTES` ON product_details.id=ATTRIBUTES.id
     WHERE ATTRIBUTES.attr in (...)
     GROUP BY product_details.id
     HAVING total=...) as t
on t.id=product_details.id

A subconsulta conta quantos atributos foram correspondidos para um produto e os elimina, onde a contagem não é igual ao número de parâmetros enviados por meio do formulário. A consulta externa obtém os detalhes do produto para aqueles em que a contagem corresponde.

Para o ... na cláusula in(), você precisa fornecer uma lista de palavras-chave separada por vírgulas, como:"'computer', 'apple'". Use a função implode() na concatenação php e szstring para obter os resultados.

Para o ... na cláusula having, substitua o número de palavras-chave no array $_POST['keyword'] (você deve verificar no código se é um array ou apenas um valor único).

Ainda assim, você deve considerar o impacto da injeção de sql em seu código.