Intereting Posts
Значение хэш-файла JavaScript генерируется с частью файла PHPUnit, интерфейсы и пространства имен (Symfony2) Как использовать Nmap в PHP exec Как получить значения для ряда флажков в контроллере Laravel 4 (если отмечено) Как преобразовать веб-приложение php в настольное приложение и сохранить базу данных Как блокировка session_start в PHP? выбор исправления исправления не разрешен как я могу проверить все элементы массива одинаковые? Определение внешних ключей Laravel с фабриками моделей, от одного до одного и от одного до многих отношений без создания ненужных моделей Как разрешить путь в классе non-контроллера в symfony2 Возможно ли запрашивать сообщения в том же порядке, что и назначенные? Любой файл .php, вызывающий ОШИБКУ ВНУТРЕННЕГО СЕРВЕРА В веб-разработке – что ASP.net может сделать, что PHP не может сделать? Почему PHP печатает знак процента, когда мой скрипт завершен? pcntl_fork и соединение MySQL ушло

mysqli bind_params для запроса вставки

Я пытаюсь использовать 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.

(Схожие вопросы задавали раньше, но я не нашел ответа на свой вопрос.)

Solutions Collecting From Web of "mysqli bind_params для запроса вставки"

Вы проходите

 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"; }