Prepared Statements met IN()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lasse

Lasse

18/06/2008 18:23:00
Quote Anchor link
Halo,
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?
 
PHP hulp

PHP hulp

24/04/2024 21:57:09
 
Joren de Wit

Joren de Wit

18/06/2008 18:32:00
Quote Anchor link
Waarom komen de waarden vandaan die je in je IN() wilt hebben?
 
Jelmer -

Jelmer -

18/06/2008 18:33:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($array as $key => $value) {
    $stmt->bindParam(':' . $key, $value);
}

?>

maar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach(array_keys($array) as $key) {
    $stmt->bindParam(':' . $key, $array[$key]);
}

?>



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>
 
Lasse

Lasse

18/06/2008 19:16:00
Quote Anchor link
@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...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.