Mijn korte vraag is: hoe "verwerk" je een variabele where clause in een bindparam constructie.

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.

Daar was ik al een beetje bang voor. Heb het nu opgelost door de $whereclause variabele op onderstaande wijze als variabel deel in de query string op te nemen en dat werkt wel.

"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.
Je kunt toch enerzijds je querystring opbouwen en anderzijds parameters binden?

Zoiets (vele varianten mogelijk):
<?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.
?>


Niet getest, maar het principe lijkt mij duidelijk? Variant met bindParam zou ook kunnen.

Reageren