sql >> Databáze >  >> RDS >> Mysql

PHP:Prohledávat databázi mysql pomocí více výběrových rozevíracích seznamů?

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

Výše uvedený operátor OR způsobí, že vaše kritéria kde vyberou záznam, i když 1 klíčové slovo odpovídá poli attr. Chcete-li očekávat, že se použijí všechna klíčová slova, změňte jej na „ AND “.

Kromě toho se zdá, že kritérium ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" platí pro všechna klíčová slova, takže toto kritérium by mělo být přidáno jednou, nikoli při každé iteraci cyklu. $currentproduct =$_POST['product']; řádek by měl být také posunut před smyčku.

EDIT:odráží změnu operátora na AND a nevracení žádných řádků.

...ATTRIBUTES.attr LIKE BINARY '$c'...

Pokud v $c nejsou žádné zástupné znaky, pak výše uvedené kritérium bude vyžadovat, aby slovo odpovídalo poli attr, jako by byl použit operátor =, což se pravděpodobně nestane. Do vyhledávání musí být zahrnuty zástupné znaky:'%$c%'

Plus nějaká ochrana před sql injection by byla také fajn.

EDIT2:Pokud je každý atribut uložen ve svém vlastním záznamu, pak to trochu komplikuje věci, protože kritéria where se posuzují vůči jedinému záznamu, nikoli proti jejich kolekci.

Dám vám ukázkový příkaz select, ale budete ho muset začlenit do svého php kódu.

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

Poddotaz počítá, kolik atributů bylo spárováno pro produkt a eliminuje ty, kde se počet nerovná počtu parametrů odeslaných prostřednictvím formuláře. Vnější dotaz získá podrobnosti o produktu pro ty, u kterých se počet shodoval.

Pro ... v klauzuli in() musíte zadat uzavřený seznam klíčových slov oddělený čárkou, jako:"'počítač', 'jablko'". K získání výsledků použijte funkci implode() v php a zřetězení sztring.

Za ... v klauzuli have nahraďte počet klíčových slov v poli $_POST['keyword'] (měli byste však zkontrolovat v kódu, zda se jedná o pole nebo pouze jednu hodnotu).

Přesto byste měli zvážit dopad vkládání sql na váš kód.




  1. Nasazení aplikace qt mysql

  2. Problém s generováním PHP PDF

  3. rails + MySQL na OSX:Knihovna není načtena:libmysqlclient.18.dylib

  4. MySQL nepoužívá index pro ORDER BY