我想通過可變數量的參數傳遞給一個類的方法。下面是我試圖調用類的功能:如何用call_user_func_array調用mysqli_stmt?
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);
....
這給出了一個錯誤:
Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in ..mypath..\dbhelper.php on line
在我的另一篇文章(點擊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
我得到這個錯誤:
Deprecated: Call-time pass-by-reference has been deprecated in ..mypath..\save.php on line
另外,我已經嘗試了這個定義功能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';
}
調用它會顯示如下錯誤:
Warning: Wrong parameter count for mysqli_stmt::bind_param() in ..mypath..\dbhelper.php on line
如果函數調用正確,那麼參數計數對bind_param是正確的。
PHP的版本是5.3.8。
請幫忙嗎?
你爲什麼要圍繞mysqli做一個包裝?如果您準備好推進,請查看PDO,它提供了更多的OOP API。 –
我也嘗試過PDO,但幾個月前,但許多事情只是不正常工作。在谷歌搜索錯誤,它出來,PDO是'相當'越野車。否則,我承認PDO可能是PHP的最佳數據庫訪問API。 –
'相當'越野車?我想知道你聽到的是哪裏。 PDO是目前MySQL(以及通用SQL)API中最發展和最穩定的。命名的佔位符和PDOExceptions。這就是我所說的。 –