<?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);
*/
Fatal error: Uncaught Error: Attempt to assign property "string" on null in /in/9ZIXg:23
Stack trace:
#0 /in/9ZIXg(28): NamedInClause->__construct(Array, 'id')
#1 {main}
thrown in /in/9ZIXg on line 23
Process exited with code 255.
Warning: Creating default object from empty value in /in/9ZIXg on line 23
string(70) "
UPDATE table
SET value1 = :val1, value2 = :val2
WHERE id IN ()
"
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 '[', expecting ')' in /in/9ZIXg on line 28
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/9ZIXg on line 14
Parse error: syntax error, unexpected '[', expecting ')' in /in/9ZIXg on line 28
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Parse error: parse error, unexpected T_ARRAY, expecting '&' or T_VARIABLE in /in/9ZIXg on line 8
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/9ZIXg on line 5
Process exited with code 255.
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/9ZIXg on line 5
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/9ZIXg on line 5
Process exited with code 255.