2008-08-15 118 views
7

在我即將完成的項目中,我編寫並實現了一個用於PHP的對象關係映射解決方案。在懷疑者和夢想家喊出「如何在地球上?」之前,放鬆一下 - 我還沒有找到一種方法來做出靜態的靜態綁定工作 - 我只是儘可能以最好的方式解決它。PHP + MYSQLI:使用預處理語句的可變參數/結果綁定

無論如何,我目前沒有使用預處理語句進行查詢,因爲我無法想出一個辦法可變數量的參數傳遞給bind_params()bind_result()方法。

爲什麼我需要支持可變數量的參數,你問?因爲我的模型的超類(將我的解決方案想象成一個被破解的PHP ActiveRecord想像者)是定義查詢的地方,例如find()方法不知道它需要綁定多少個參數。

現在,我已經想過創建一個參數列表並將一個字符串傳遞給eval(),但我不太喜歡這個解決方案 - 我寧願只實現我自己的安全檢查並傳遞聲明。

有沒有人有關於如何完成這項工作的建議(或成功案例)?如果你能幫我解決這個第一個問題,或許我們可以解決綁定結果集的問題(如果涉及初始查詢來確定表結構,我懷疑會更困難,或者至少會佔用更多的資源)。

回答

13

在PHP中,您可以使用call_user_func_array將可變數量的參數傳遞給函數或方法。一個方法的例子是:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

該函數將被調用,數組中的每個成員都作爲自己的參數傳遞。

+0

我認爲函數名應該是`bind_param`而不是`bindparams`。至少在我的`mysqli`版本中,我使用它輸入`$ stmt-> bind_param()`,而不是`$ stmt-> bindparams()`。乾杯! – 2014-01-03 11:33:00

1

我不允許修改,但我相信在代碼

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

在$語句前面的參考是沒有必要的。由於$stmt是對象,而bindparams是該對象中的方法,所以引用不是必需的。它應該是:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params); 

欲瞭解更多信息,請參閱PHP手冊上Callback Functions

0
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params); 

,我在我的環境沒有工作,但這個答案讓我在正確的軌道上什麼。實際工作是:

$sitesql = ''; 
$array_of_params = array(); 
foreach($_POST['multiselect'] as $value){ 
    if($sitesql!=''){ 
     $sitesql .= "OR siteID=? "; 
     $array_of_params[0] .= 'i'; 
     $array_of_params[] = $value; 
    }else{ 
     $sitesql = " siteID=? "; 
     $array_of_params[0] .= 'i'; 
     $array_of_params[] = $value; 
    } 
} 

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'"); 
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params); 
$stmt->execute(); 
2

你必須確保$ array_of_params是鏈接數組變量,不是值mselves。應該是:

$array_of_params[0] = &$param_string; //link to variable that stores types 

然後...

$param_string .= "i"; 
$user_id_var = $_GET['user_id'];// 
$array_of_params[] = &$user_id_var; //link to variable that stores value 

否則(如果它是值的數組),你會得到:

PHP的警告:參數2 mysqli_stmt :: bind_param()預計將參考


再舉一個例子:

$bind_names[] = implode($types); //putting types of parameters in a string 
for ($i = 0; $i < count($params); $i++) 
{ 
    $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3... 
    $$bind_name = $params[$i]; //create a variable with this name and put value in it 
    $bind_names[] = & $$bind_name; //put a link to this variable in array 
} 

和BOOOOOM:

call_user_func_array(array ($stmt, 'bind_param'), $bind_names); 
相關問題