mysqli bind_params для запроса вставки - PullRequest
1 голос
/ 10 февраля 2010

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

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

1 Ответ

2 голосов
/ 10 февраля 2010

Вы проходите

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...