Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] query opbouwen met meerdere zoekopties

Pagina: 1
Acties:

  • ID-College
  • Registratie: November 2003
  • Laatst online: 17:58
Beste mannen,

Ik heb twee tabellen (dit worden er hoogstwaarschijnlijk drie uiteindelijk). Daarbij heb ik negen zoekopties (i.e. filters) waarmee je kunt filteren.
Met behulp van jQuery en JSON haal ik de results op de achtergrond op. Nu vraag ik mij af wat de beste manier is op de query op te bouwen. Ik heb namelijk nu:
PHP:
1
2
$sql = "SELECT * FROM a INNER JOIN b ON a.id = b.id WHERE ";
//hier moeten de WHERE clausules komen.

Nu werkte ik voorheen altijd met SQL en haalde ik waardes op waarbij ik gewoon deed:
PHP:
1
2
3
4
5
if(a)
$sql .= "a.naam = '".$waardeX."'";
if(b)
$sql .= "AND b.titel = '".$waardeY."'";
//etc


Echter vind ik het smering om allemaal AND erachter te plakken, zeker wanneer je alle filters aanzet. Dan krijg je dus 9 keer AND in je query. Bovendien werk ik met MySQLi en prepared statements, en dus weet ik even niet hoe ik de juiste paramaters moet binden.
Wat is hier een doeltreffende oplossing voor? Wie kan mij een klein beetje in de richting duwen hoe ik makkelijk de query opbouw zonder 9x AND als clausule op te geven. Het liefst met prepared statements :)

  • radem205
  • Registratie: Juni 2002
  • Laatst online: 02-02-2022
Het lijkt mij dat je sowieso de filter variabelen moet controleren (op z'n bestaan, op de verwachte waarde, etc.). Hierna zal je (bij mijn weten) wel degelijk gebruik moeten maken van afzonderlijke AND operators. Voor meerdere OR operators op één veld kan je ook IN() gebruiken.

Je zal tevens met de prepared statements moeten nagaan welke filters gebruikt moeten worden om de juiste variabelen te binden. Dus een hele korte en eenvoudige oplossing is er naar mijn weten niet.

  • ID-College
  • Registratie: November 2003
  • Laatst online: 17:58
De waarden worden afgevangen idd. Ze zijn al van te voren gedefinieerd, dus SQL injection is sowieso niet mogelijk.. IN() is idd een goede, daar ga ik naar kijken.
Nu wordt een array naar de functie verzonden. Met switch() werk ik de verschillende waarden af en bouw de query op. Opzich werkt dit wel, echter gooi ik de waarden nu direct in de query. Ik maak liever gebruik van bind_param(), echter loop ik dan tegen het feit aan welke variabele op welke plek hoort.. Afhankelijk van de filters is dit anders elke keer :)
Nu heb ik ongeveer (heb de code hier niet)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach($waarde as $value => $result){
 switch($result){
  case 'A':
   //wat validatie en daarna:
    $sql .= "AND waarde=?";
    $this->bindV .= "s";
    break;
  case 'B':
   //etc
 }
}
//En dan bij de prepared statement:
bind_param($this->bindV, //hier de waardes)

Het probleem is dus nu dat ik niet weet welke waardes daar moeten. Dit is variabel en weet ook niet hoe ik dit moet realiseren?

[ Voor 31% gewijzigd door ID-College op 11-04-2011 22:42 ]


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 21:19

The Eagle

I wear my sunglasses at night

Vwb die bind-variabeles en je algemene vraag:

Zoals al aangegeven moet je bij ieder zoekveld afvangen of het gevuld is. Als je dat in een for-loop af kunt vangen, kun je in die for-loop ook je bindparameters dynamisch declaren.
Ik vermoed dat je met een java app bezig bent? Dan moet je volgens mij velden kunnen opzoeken op je pagina. Die kun je dynamisch referencen (for &i = 1 to fieldnum)
Vervolgens in je for loop de logica maken van checken op gevuld zijn, en indien gevuld een "AND veldnaam = $waarde" opnamen in een where-clause string.
Die laatste draai je vervolgens tegen de DB aan in je select voor het ophalen van je waardes.

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)