Halo,
Ik heb een prepared statement gemaakt, met daarin een IN() functie. De documentatie van PDO is hierin heel duidelijk:
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:
<?php
foreach($array as $key => $value) {
$stmt->bindParam(':' . $key, $value);
}
?>
maar
<?php
foreach(array_keys($array) as $key) {
$stmt->bindParam(':' . $key, $array[$key]);
}
?>


<?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();
?>
@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...

Reageren