<?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);
*/
string(86) "
UPDATE table
SET value1 = :val1, value2 = :val2
WHERE id IN (:id0, :id1, :id2)
"
array(5) {
["val1"]=>
string(5) "Hello"
["val2"]=>
string(5) "World"
["id0"]=>
int(1)
["id1"]=>
int(2)
["id2"]=>
int(3)
}
Output for 5.3.0 - 5.3.29
Parse error: syntax error, unexpected '[' in /in/d2YBI on line 25
Process exited with code 255.
Output for 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/d2YBI on line 10
Parse error: syntax error, unexpected '[' in /in/d2YBI on line 25
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/d2YBI on line 10
Parse error: parse error, unexpected '[' in /in/d2YBI on line 25
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_NEW in /in/d2YBI on line 10
Process exited with code 255.