【发布时间】:2012-11-26 18:31:47
【问题描述】:
我正在尝试将可变数量的参数传递给类的方法。这是我试图调用的类的函数:
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);
....
这给出了一个错误:
警告:mysqli_stmt::bind_param() 的参数 2 应为参考,在 ..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。
有什么帮助吗?
【问题讨论】:
-
你为什么要围绕 mysqli 做一个包装器?如果您准备好继续前进,请查看 PDO,它提供了更多的 OOP API。
-
几个月前我也尝试过 PDO,但很多事情都无法正常工作。在谷歌搜索错误时,发现 PDO 是“相当”的错误。否则,我承认 PDO 可能是 PHP 最好的数据库访问 API。
-
'相当'越野车?我想知道你在哪里听到的。 PDO 目前是 MySQL(以及一般的 SQL)API 中发展最快、最稳定的 API。命名占位符和 PDOExceptions。这就是我要说的。
-
我并没有不同意你的观点。正如我所说,几个月前我使用过 PDO,当时它可能是“不稳定的”。我什至在 StackOverflow 上发布了一些问题。你甚至可以谷歌“pdo bugs”。您会在第一页找到许多搜索。无论如何,这些错误现在可能已经修复了。从那以后我没有使用过 PDO。如果现在稳定了,我会很乐意再次使用它。
-
这些错误是在 2005 年到 2008 年期间提交的。所有这些错误都在很久以前就已修复。我不知道你遇到过什么样的错误,但是我使用 PDO 已经超过几个月了,并且从 PHP 5.0/5.1.x 开始就没有遇到过问题