2010-09-09 28 views
8

可能重複:
Is it possible to pass parameters by reference using call_user_func_array()?PHP5.3 - mysqli_stmt:bind_params與call_user_func_array警告

我有這在PHP 5.1的工作下面的代碼行,但不是在工作PHP 5.3。

$input = array('ss','john','programmer'); 
call_user_func_array(array($mysqli_stmt, 'bind_param'), $input); 

在PHP 5.3時,得到以下警告消息:

警告:參數2至mysqli_stmt :: bind_param()預計是一個參考,值在/ var/WWW/startmission給出/em/class/cls.data_access_object.php上線785

我改變了代碼以下和它的工作:

$a = 'johnl'; 
$b = 'programmer'; 
$mysqli_stmt->bind_param('ss',$a,$b); 

我發現這個PHP文檔中:

護理必須與call_user_func_array 結合使用mysqli_stmt_bind_param()時,應考慮()。請注意, mysqli_stmt_bind_param()需要通過引用傳遞參數 ,而call_user_func_array()可以接受可以表示引用或值的變量列表 作爲參數。

所以我的問題是,如何複製call_user_func_array + bind_params的功能,以便我可以在運行時動態綁定變量?

+0

這不是一個鏈接到的重複。這具體是關於call_user_func_array WITH mysqli。鏈接的問題根本與mysqli沒有任何關係。 – dewd 2014-03-21 16:12:20

回答

13

我找到了答案,我的問題在用戶說明fabio at kidopi dot com dot br3 years ago on the PHP manual page of mysqli_stmt::bind_param()(略有修改):

我曾經有call_user_func_arraybind_param問題移植到PHP 5.3之後。

原因是5.3需要數組值作爲參考,而5.2使用實際值(但也帶有引用)。所以,我創建了一個次要的輔助功​​能,以幫助我:

function refValues($arr) 
{ 
     $refs = array(); 

     foreach ($arr as $key => $value) 
     { 
      $refs[$key] = &$arr[$key]; 
     } 

     return $refs; 
} 

和改變了我以前的功能:

call_user_func_array(array($this->stmt, "bind_param"), $this->values); 

到:

call_user_func_array(array($this->stmt, "bind_param"), refValues($this->values)); 

這樣,我的數據庫功能保持工作在PHP 5.2/5.3服務器中。

+0

這個refValues函數不能編譯。它有大量的大括號不匹配...你能解決它嗎? – Jelle 2013-05-01 19:23:32

+1

您需要先添加類型。 $ types ='ss',array_unshift($ input,$ types);那麼上面的功能將會很好地工作。謝謝約翰。 – apis17 2013-12-11 10:22:03