Variabele where clause met bindparam
Iets langere variant:
Heb een variabele $whereclause, waarin een deel van de where clause dynamisch wordt opgebouwd. Afhankelijk van keuzes op het scherm worden daar delen aan toegevoegd dus de ( uiteindelijke ) variabele kan er als volgt uit gaan zien: $whereclause = ' and naam = "Pietje" and plaats = "Amsterdam"'.
Deze dynamische where clause komt achter een vaste where clause waarvan de waarde overigens wél variabel is.
In al mijn naïviteit bouwde ik de query string ( ongeveer ) als volgt "select naam, plaats from tabel where land = :value1 :value2", gevolgd door de lijst van variabelen, waarbij :value2 dus vervangen moest worden door $whereclause. Helaas bleek dit niet te werken, vandaar bovenstaande vraag.
Wellicht ten overvloede: heb dus een functie waaraan de query én de van toepassing zijnde variabelen worden doorgegeven en in deze functie vindt dan de feitelijke bindparam plaats ( bindParam(':value1', $value1, PDO::PARAM_STR etc.)
Gerard
Volgens mij kan dit niet op deze manier.
"select naam, plaats from tabel where land = :value1 ".$whereclause.""
Had juist de "bindparam" constructie toegepast om dat ik begrepen had dat het "direct" combineren van vaste en variabele delen in een query string ( "select naam, plaats from tabel where land = '".$land."' ".$whereclause."" ) "een beetje hackgevoeliger" is. Daarom is het jammer dat ik ook die $whereclause niet daarin kan verwerken.
Zoiets (vele varianten mogelijk):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$sql = 'SELECT * FROM tabel';
$args = array();
$values = array();
if ($zoekParameter1Ingesteld) {
$args['col1'] = 'co11 = :col1value';
$values['col1'] = '<de waarde>';
}
if ($zoekParameter2Ingesteld) {
$args['col2'] = 'col2 = :col2value';
$values['col2'] = '<de waarde>';
}
// etc.
if (count($args)) {
$sql .= ' WHERE '.implode(' AND ', $args);
}
$st = $db->prepare($sql);
if (count($args)) {
foreach ($args as $k => $v) {
$st->bindValue(':'.$k.'value', $v);
}
}
// etc.
?>
$sql = 'SELECT * FROM tabel';
$args = array();
$values = array();
if ($zoekParameter1Ingesteld) {
$args['col1'] = 'co11 = :col1value';
$values['col1'] = '<de waarde>';
}
if ($zoekParameter2Ingesteld) {
$args['col2'] = 'col2 = :col2value';
$values['col2'] = '<de waarde>';
}
// etc.
if (count($args)) {
$sql .= ' WHERE '.implode(' AND ', $args);
}
$st = $db->prepare($sql);
if (count($args)) {
foreach ($args as $k => $v) {
$st->bindValue(':'.$k.'value', $v);
}
}
// etc.
?>
Niet getest, maar het principe lijkt mij duidelijk? Variant met bindParam zou ook kunnen.