<?php
class NamedInClause
{
public $data;
public $clause;
public function __construct(array $array, $name = 'in') {
$placeholders = array();
$i = 0;
$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');
}
foreach ($array as $value) {
$key = $name . $i++;
$placeholders[] = ':' . $key;
$this->data[$key] = $value;
}
$clause->string = implode(', ', $placeholders);
}
}
$inClause = new NamedInClause([1, 2, 3], 'id');
// Build the query string
$query = "
UPDATE table
SET value1 = :val1, value2 = :val2
WHERE id IN (" . $inClause->clause . ")
";
// Create the data array. Get an array of concrete values and merge the IN clause data
$data = array('val1' => 'Hello', 'val2' => 'World') + $inClause->data;
var_dump($query, $data);
/*
$stmt = $db->prepare($query);
$stmt->execute($data);
*/