Я пытаюсь использовать call_user_func_array и mysqli_stmt :: bind_param так:
# A. prepare an insert query statement $this->_stmt = $db_link->prepare('INSERT INTO foo (col1, col2) VALUES (?,?)'); # B. bind a placeholder array to the statement $bound = array('col1' => null, 'col2' => null); call_user_func_array(array($this->_stmt, 'bind_param'), array($types_string, &$bound)); # C. while there are records, retrieve, munge, and insert while ($row = $res->fetch_assoc()) { $bound = transform($row); # $bound remains an array indexed as 'col1', 'col2' $this->_stmt->execute(); # PHP Notice: Array to string conversion }
Я смущаюсь ссылками PHP, приводя к преобразованию массива в строку. Либо я не привязываю массив заполнителей правильно к шагу B, либо я не назначаю местозаполнитель правильно на этапе C.
(Схожие вопросы задавали раньше, но я не нашел ответа на свой вопрос.)
Вы проходите
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 передаются функции ссылкой, другие передаются значением. […]
Например
$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"; }
с$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"; }