Ich weiß auch, dass dieser Thread alt ist, aber ich hatte ein einzigartiges Problem, bei dem ich beim Konvertieren des bald veralteten mysql-Treibers in den PDO-Treiber eine Funktion erstellen musste, die dynamisch sowohl normale params als auch INs aus demselben param-Array erstellen konnte. Also habe ich dies schnell gebaut:
/**
* mysql::pdo_query('SELECT * FROM TBL_WHOOP WHERE type_of_whoop IN :param AND siz_of_whoop = :size', array(':param' => array(1,2,3), ':size' => 3))
*
* @param $query
* @param $params
*/
function pdo_query($query, $params = array()){
if(!$query)
trigger_error('Could not query nothing');
// Lets get our IN fields first
$in_fields = array();
foreach($params as $field => $value){
if(is_array($value)){
for($i=0,$size=sizeof($value);$i<$size;$i++)
$in_array[] = $field.$i;
$query = str_replace($field, "(".implode(',', $in_array).")", $query); // Lets replace the position in the query string with the full version
$in_fields[$field] = $value; // Lets add this field to an array for use later
unset($params[$field]); // Lets unset so we don't bind the param later down the line
}
}
$query_obj = $this->pdo_link->prepare($query);
$query_obj->setFetchMode(PDO::FETCH_ASSOC);
// Now lets bind normal params.
foreach($params as $field => $value) $query_obj->bindValue($field, $value);
// Now lets bind the IN params
foreach($in_fields as $field => $value){
for($i=0,$size=sizeof($value);$i<$size;$i++)
$query_obj->bindValue($field.$i, $value[$i]); // Both the named param index and this index are based off the array index which has not changed...hopefully
}
$query_obj->execute();
if($query_obj->rowCount() <= 0)
return null;
return $query_obj;
}
Es ist noch nicht getestet, aber die Logik scheint vorhanden zu sein.
Ich hoffe, es hilft jemandem, der sich in der gleichen Lage befindet,
Edit: Nach einigen Tests habe ich herausgefunden:
- PDO mag kein '.' in ihren Namen (was irgendwie dumm ist, wenn Sie mich fragen)
- bindParam ist die falsche Funktion, bindValue ist die richtige Funktion.
Der Code wurde zu einer funktionierenden Version bearbeitet.