<?php
function pdo_named_in_clause_from_array($array, $name = 'in') {
$in = $data = array();
$i = 0;
// Check that the placeholder names we will produce will be valid
$name = preg_replace('/[^a-z0-9_]+/', '', (string)$name);
if (!preg_match('/^[a-z]/i', $name)) {
throw new \InvalidArgumentException('Placeholder name ' . $name . ': must begin with a letter');
}
// Build an array of placeholder names and a map of placeholders => values
foreach ($array as $value) {
$key = $name . $i++;
$in[] = ':' . $key;
$data[$key] = $value;
}
// Collapse placeholder names to comma separated string and return it along with the data
return array(implode(', ', $in), $data);
}
// The data to go into the IN clause
$inList = [1, 2, 3];
// Prepare the IN clause data for use
list($inClause, $inData) = pdo_named_in_clause_from_array($inList, 'id');
// Build the query string
$query = "
UPDATE table
SET value1 = :val1, value2 = :val2
WHERE id IN (" . $inClause . ")
";
// Create the data array. Get an array of concrete values and merge the IN clause data
$data = array('val1' => 'Hello', 'val2' => 'World') + $inData;
var_dump($query, $data);
/*
$stmt = $db->prepare($query);
$stmt->execute($data);
*/