phpbar.de logo

Mailinglisten-Archive

[php] PDO mit bindValue (mal wieder)

[php] PDO mit bindValue (mal wieder)

Christian Wohlgemuth info at codesign-online.de
Mon Feb 4 18:52:46 CET 2008


Yannik Hampe wrote:
> 
> Christian Wohlgemuth wrote:
>> Hallo Liste,
>>
>> ich habe wieder ein Problem mit PDO und bindValue.
>> Diesmal bei folgender Query:
>>
>> [..]
>> $query = 'SELECT * FROM `tabelle` WHERE `tabelle`.`id` IN (?)';
>> $stmt = $pdo->prepare($query);
>> $stmt->bindValue(1, implode(', ',$array));
>> $stmt->execute();
>> [..]
>>
>> leider bekomme ich laut mysql.log folgendes Query:
>> [..]
>> SELECT * FROM `tabelle` WHERE `tabelle`.`id` IN ('1, 3, 7')
>> [..]
>> und somit das falsche Ergebnis.
> 
> Stimmt. So sollte es aber funktionieren:
> ---
> $query = 'SELECT * FROM `tabelle` WHERE `tabelle`.`id` IN 
> (?'.str_repeat(',?',count($array)-1).')';
> $stmt = $pdo->prepare($query);
> $stmt->bindValue(1, $array);
> ---
> Der Code geht jedoch davon aus, dass $array immer mindestens ein Element 
> enthält. Du solltest entweder sicherstellen, dass dies der Fall ist, 
> oder meinen Code umschreiben.
>> vielen Dank
>> Christian
> 
> Yannik

bei deinem Code bekomme ich aber eine Nachricht bei 'bindValue':
[..]Array to string conversion[..]
Danach die Fehlermeldung von PDO:
[..]Invalid parameter number: number of bound variables does not match 
number of tokens[..]

Also kann ich keine Arrays übergeben bei bindValue.

Ich habe es jetzt so gelöst:
[..]
$query = 'SELECT * FROM `tabelle` WHERE `tabelle`.`id` IN 
(?'.str_repeat(',?',count($array)-1).')';
$stmt = $pdo->prepare($query);

$anzahl = count($array);
for ($i = 0; $i < $anzahl; $i++) {
   $stmt->bindValue(($i+1), $array[$i]);
}

$stmt->execute();

Meine PHP-Version ist 5.2.1

Also ein zufriedenes Gefühl, über diese Lösung, fühlt sich anders an ;)
Meint Ihr, dort wird irgendwann eine 'schönere' Lösung seitens PDO 
angeboten?

schönen Feierabend
Christian

php::bar PHP Wiki   -   Listenarchive