Prepared Statements met IN()
Halo,
Ik heb een prepared statement gemaakt, met daarin een IN() functie. De documentatie van PDO is hierin heel duidelijk:
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?
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?
1. Geen prepared statement gebruiken. Maar gewoon een combi van PDO::quote en implode.
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
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();
?>
@Blanche: Die komen uit een array, die weer uit Swift Mailer komt, en adressen representeert waarvan het mislukt is om er een email naar te verzenden.
@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...
@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...




