Вы проходите
array(
types,
&array(
a, b, c
)
)
to call_user_func_array (), но должно быть
array(
types, &a, &b, &c
)
Один из способов сделать это - использовать другой (временный) массив со всеми элементами «исходного» массива в качестве ссылок. http://docs.php.net/call_user_func_array:
Примечание: ссылочные переменные в param_arr передаются в функцию по ссылке, другие передаются по значению. [...]
* 1013 Е.Г. *
$mysql = new mysqli('localhost', 'localonly', 'localonly', 'test');
// test table
$mysql->query('CREATE TEMPORARY TABLE foo (a int, b int, c int)') or die($mysql->error);
$params = array('a'=>null, 'b'=>null, 'c'=>null);
$types = 'iii';
$stmt = $mysql->prepare('INSERT INTO foo (a,b,c) VALUES (?,?,?)');
// make an array of references to the original array
$tmp = array($types);
foreach( $params as &$p ) {
$tmp[] = &$p;
}
call_user_func_array( array($stmt, 'bind_param'), $tmp);
// test insert
for($i=0; $i<10; $i++) {
$params['a'] = $i;
$params['b'] = $i+100;
$params['c'] = $i+1000;
$stmt->execute();
}
unset($stmt);
// test select
$result = $mysql->query('SELECT * FROM foo');
while( null!==($row=$result->fetch_row()) ) {
echo join(',', $row), "\n";
}