Prepared Statements met IN()
Ik heb een prepared statement gemaakt, met daarin een IN() functie. De documentatie van PDO is hierin heel duidelijk:
Quote:
You cannot bind multiple values to a single parameter; for example, you cannot bind two values to a single named parameter in an IN() clause.
Bron: PDOStatement::execute() documentatie.
Maar mijn query is nu eenmaal zo, en ik moet dus eigenlijk een oplossing vinden... En mijn vraag aan jullie is: Weten jullie er een?
Waarom komen de waarden vandaan die je in je IN() wilt hebben?
2. Je prepared statement eerst laten genereren op basis van de waarden die je erin wilt stoppen (dus weer implode, maar nu met placeholder-namen) en dan later dezen met een lusje toewijzen aan het statement. Let hier wel even heel erg op: bindParam verbindt je variabele met de query. Verander je de waarde van de variabele, dan pakt hij dus de waarde die je variabele heeft wanneer je PDOStatement::execute aanroept. Je moet dus even opletten dat je bij bijvoorbeeld een foreach-lus. Niet:
maar
Code (php)
1
2
3
4
5
2
3
4
5
<?php
foreach(array_keys($array) as $key) {
$stmt->bindParam(':' . $key, $array[$key]);
}
?>
foreach(array_keys($array) as $key) {
$stmt->bindParam(':' . $key, $array[$key]);
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$bindings = array_map(create_function('$x', 'return ":$x";'), array_keys($array));
$query = sprintf('SELECT * FROM x WHERE y IN(%s)',implode(', ', $bindings));
$stmt = $pdo->prepare($query);
foreach(array_keys($array) as $key) {
$stmt->bindParam(':' . $key, $array[$key]);
}
$stmt->execute();
?>
$bindings = array_map(create_function('$x', 'return ":$x";'), array_keys($array));
$query = sprintf('SELECT * FROM x WHERE y IN(%s)',implode(', ', $bindings));
$stmt = $pdo->prepare($query);
foreach(array_keys($array) as $key) {
$stmt->bindParam(':' . $key, $array[$key]);
}
$stmt->execute();
?>
@Jelmer: Methode twee vind ik wel een erg goed idee. Dat ga ik maar eens proberen. Dank je voor het idee:D
Overgins heb je voor de opmerking over bindParam() de oplossing bindValue(). Daarmee kun je gewoon een string binden...