sql >> Database >  >> RDS >> Mysql

PHP:doorzoek de mysql-database met behulp van meerdere keuzelijsten?

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

De bovenstaande OR-operator zorgt ervoor dat uw waar-criteria een record selecteren, zelfs als 1 trefwoord overeenkomt met het attr-veld. Wijzig dit in " EN " om te verwachten dat alle zoekwoorden van toepassing zijn.

Bovendien lijkt het criterium ... AND ATTRIBUTES.sub_cat_name='$currentproduct'" van toepassing te zijn op alle zoekwoorden, dus dit criterium moet één keer worden toegevoegd, niet bij elke iteratie van de lus. $currentproduct =$_POST['product']; rij moet ook voor de lus worden geplaatst.

EDIT:om na te denken over het wijzigen van de opreator in AND en zonder dat er rijen worden geretourneerd.

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

Als $c geen jokertekens bevat, vereist het bovenstaande criterium dat het woord overeenkomt met het attr-veld alsof de operator =is gebruikt, wat onwaarschijnlijk is. Jokertekens moeten worden opgenomen in de zoekopdracht:'%$c%'

Plus wat bescherming tegen sql-injectie zou ook leuk zijn.

EDIT2:Als elk attribuut in zijn eigen record wordt opgeslagen, maakt het de zaken een beetje ingewikkeld, omdat de waar-criteria worden beoordeeld op basis van een enkele record, niet een verzameling ervan.

Ik zal je een voorbeeld van een select-commando geven, maar je zult het in je php-code moeten opnemen.

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

De subquery telt hoeveel attributen zijn gematcht voor een product en elimineert die, waarvan het aantal niet gelijk is aan het aantal parameters dat via het formulier is ingediend. De buitenste zoekopdracht haalt de productdetails op voor degenen waar het aantal overeenkomt.

Voor de ... in de in()-clausule moet u een door komma's gescheiden, ' ingesloten lijst van de trefwoorden opgeven, zoals:"'computer', 'apple'". Gebruik de functie implode() in php en sztring aaneenschakeling om de resultaten te krijgen.

Voor de ... in de hebbende clausule vervangt u het aantal trefwoorden in de $_POST['keyword'] array (u moet de code echter controleren als het een array is of slechts een enkele waarde).

Toch moet u rekening houden met de impact van sql-injectie op uw code.




  1. twee geselecteerde uitspraken samenvoegen

  2. Oracle-subquery ziet de variabele niet vanaf het buitenste blok 2 niveaus hoger

  3. Hoe importeer ik bestaande *.sql-bestanden in PostgreSQL 8.4?

  4. Hoe de meest recente versie van Sqlite aar te installeren bij gebruik van Room On Android