Multiple checkboxes filter

Status
Niet open voor verdere reacties.

Junior1986

Gebruiker
Lid geworden
16 mrt 2009
Berichten
10
Hallo,

Ik heb een lijst met checkboxes:
<input type='checkbox' name='check[]' value='kleur_rood'></input>
<input type='checkbox' name='check[]' value='kleur_blauw'></input>

<input type='checkbox' name='check[]' value='merk_toyota'></input>
<input type='checkbox' name='check[]' value='merk_bmw'></input>

Wat ik probeer te bereiken is om aan de hand van deze checkboxes resultaten vanuit de database te filteren.
Kies ik bijvoorbeeld checkbox: kleur_rood & kleur_blauw & merk_bmw, dan moet een select query ervoor zorgen dat in database veld: kleur en merk wordt gezocht naar de waardes: rood, blauw en bmw.

In code zou het ongeveer dit moeten zijn:

PHP:
SELECT * FROM auto WHERE kleur = 'rood' AND kleur = 'blauw' AND merk = 'bmw'


Wat ik tot nu toe heb is het volgende:


PHP:
if(isset($_POST['check']))
{		
		foreach($_POST['check'] as $value)
                {
			$gekozen_checkbox_exploded = explode("_",$value);
			$veldnaam = $gekozen_checkbox_exploded[0].' '; //veldnaam
			$veldwaarde = $gekozen_checkbox_exploded[1]; //veldwaarde
                 }
}

Heeft iemand enig idee hoe ik verder moet?
Alvast bedankt!
 
Laatst bewerkt:
Wat ik zou doen, is ten eerste de naam structuur van je checkboxen aanpassen, op deze manier:

<input type='checkbox' name='check[kleur][]' value='rood'></input>

Op die manier hoef je alvast niet de values uit elkaar te gaan trekken, dat scheelt weer wat werk.

Verder moet je dus elk van de veldnamen in $_POST['check'] gaan filteren, en voor elk veld moet je elke waarde een OR meegeven...

Dus je loopt met een foreach over $_POST['check'] heen, en dan krijg je een nieuwe lijst met arrays, die moet je met ORs aan elkaar verbinden, en daarna moet je de eerste array met AND verbinden... ongeveer zo:

PHP:
$higher_wheres = array();
$lower_wheres = array();
foreach( $_POST['check'] as $field => $values ) {
  foreach( $values as $value ) {
    $lower_wheres[] = $field . "= '" . $value . "'"; // kleur = 'rood'
  }
  // verbind lower wheres met OR
  $higher_wheres[] = '( ' . implode( " OR ", $lower_wheres ) . ' )'; // ( kleur = 'rood' OR kleur = 'groen' )

}
// verbind nu de higher wheres ook, met AND
$where = implode( " AND ", $higher_wheres ); // ( merk = 'daf' ) AND ( kleur = 'rood' OR kleur = 'groen' )

Dit script is niet getest, maar het zou je hopelijk ver genoeg in de juiste richting moeten wijzen :)
 
Hallo Frats bedankt voor je antwoord!

Ik zal de code meteen testen.

Is het niet mogelijk om alle geselecteerde merken en kleuren te selecteren?
Dus in plaats van dit:
PHP:
$where = implode( " AND ", $higher_wheres ); // ( merk = 'daf' ) AND ( kleur = 'rood' OR kleur = 'groen' )

Dit ervan te maken ?
PHP:
$where = implode( " AND ", $higher_wheres ); // ( merk = 'daf' ) AND ( kleur = 'rood' AND kleur = 'groen' )
 
Dan krijg je autos die tegelijkertijd rood en groen zijn... dat kan niet.
 
Mm ok dus het is dus helemaal niet mogelijk dan? (bv: meerdere auto kleuren te kiezen)

Ik heb jou script getest en als ik $where op het scherm 'echo' dan krijg ik dit:
( kleur= 'rood' OR kleur= 'blauw' ) AND ( kleur= 'rood' OR kleur= 'blauw' OR merk= 'bmw' OR merk= 'audi' )

Dit is het resultaat als ik alle vier checkboxes selecteer.
Enig idee wat de oorzaak hiervan is ??
 
Oeps, ja er moet nog een $lower_wheres=array(); staan onder regel 8 van mijn voorbeeld.

Je kunt wel meerdere kleuren selecteren, dat gebeurd nu. Door een OR te nemen krijg je alle auto's die rood OF groen zijn. Als je wil dat een auto meerdere kleuren tegelijk kan hebben moet je een andere tabelstructuur hebben waarbij er een koppeltabel is die aangeeft in welke kleuren een auto beschikbaar is, maar dan wordt de query ook wat lastiger.
 
Omg: hulde!

Dit is precies wat ik wilde.
Harstikke bedankt, en god bless you!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan