2012-11-26 78 views
2

我想通過可變數量的參數傳遞給一個類的方法。下面是我試圖調用類的功能:如何用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。

請幫忙嗎?

+1

你爲什麼要圍繞mysqli做一個包裝?如果您準備好推進,請查看PDO,它提供了更多的OOP API。 –

+0

我也嘗試過PDO,但幾個月前,但許多事情只是不正常工作。在谷歌搜索錯誤,它出來,PDO是'相當'越野車。否則,我承認PDO可能是PHP的最佳數據庫訪問API。 –

+1

'相當'越野車?我想知道你聽到的是哪裏。 PDO是目前MySQL(以及通用SQL)API中最發展和最穩定的。命名的佔位符和PDOExceptions。這就是我所說的。 –

回答

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; 
} 
+0

那麼Narf!你把我的頭髮從頭上刮下來了謝謝。 –

相關問題