我试图将一个可变数量的参数传递给一个类的方法。这是我试图调用的类的函数:
class DbHelper{
....
public function Execute($query, $params){
$this->open();
$stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
call_user_func_array(array($stmt, 'bind_param'), $params); // 1
return $stmt->execute() ? $stmt->num_rows : 'ERROR';
}
....
}
以下是我用来调用函数的代码:
....
$conn = new DbHelper();
$params = array('ss', $ID, $i);
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', $params);
....
这会出错:
警告:参数2到mysqli_stmt :: bind_param()应该是一个引用,在..mypath .. \ dbhelper.php中给出的值
在我的另一篇文章(点击here)几个月前的同一个问题上,有些人建议我使用以下代码:
call_user_func_array(array($stmt, 'bind_param'), refValues($params));
function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0){ //Reference is required for PHP 5.3+
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
再次使用它会产生同样的错误。如果我调用这样的函数(在$ params之前添加&):
$conn->Execute('INSERT INTO some_table (ID, `Index`) VALUES (?,?)', &$params); // 2
我收到此错误:
不推荐使用:已在线路上的..mypath .. \ save.php中弃用了调用时传递引用
或者,我已经尝试了函数DbHelper::Execute
的这个定义:
public function Execute($query, $params){
$this->open();
$stmt = $this->mysqli->prepare($query) or die($this->mysqli->error);
$stmt->{'bind_param'}($params); // 3
return $stmt->execute() ? $stmt->num_rows : 'ERROR';
}
调用它会将错误显示为:
警告:mysqli_stmt :: bind_param()中的参数计数错误 行上的..mypath .. \ dbhelper.php
如果函数被正确调用,则参数计数对于bind_param是正确的。
PHP的版本是5.3.8。
请帮忙吗?
答案 0 :(得分:3)
建议您的功能也需要通过引用接受$params
。这是一个稍微更新的版本:
function refValues(&$arr)
{
//Reference is required for PHP 5.3+
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$refs = array();
foreach(array_keys($arr) as $key)
{
$refs[$key] = &$arr[$key];
}
return $refs;
}
return $arr;
}