2010-02-09 60 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"; 
}