2010-02-09 2 views
1

Я пытаюсь использовать call_user_func_array и mysqli_stmt :: bind_param как так:Mysqli bind_params для вставки запроса

# 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.

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

ответ

2

Вы проходя

array(
    types, 
    &array(
    a, b, c 
) 
) 

к call_user_func_array(), но он должен быть

array(
    types, &a, &b, &c 
) 

Один из способов сделать это, чтобы использовать другой (временный) массив со всеми элементами «оригинального» массива в качестве ссылок. http://docs.php.net/call_user_func_array:

Примечание: ссылочные переменные в param_arr передаются функции ссылкой, другие передаются значением. [...]

E.g.

$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"; 
} 
Смежные вопросы