2017-08-28 65 views
0

參考陣列我有一個類似的問題,這樣的問題作者:PHP 7.0的mysqli - 爲call_user_func_array

MySQLI binding params using call_user_func_array

但我的問題得到重複的標籤之前,該解決方案並沒有爲我工作了。

這實際上是我的代碼:

// in classfoodao.php 
function updateClassfoo(Classfoo $classfoo){ 
    $values = array(); 
    global $conn,$f; 
    $pattern = ""; 
    /* updateFields get all defined attributes in classfoo object and then write in the $sql string 
    * A prepared statement only for the not null attribs, 
    * and also put the attribs in the same order in the $values array. 
    * The same are done for the $pattern string. 
    * $values and $pattern are passed by reference. 
    */ 
    $sql = $classfoo->updateFields($values, $pattern); 
    if (!empty($values) && !empty($pattern)) { 
    $stmt = $conn->prepare($sql); 
    $temp = array($pattern); 
    for ($i = 0, $count = count($values); $i < $count; $i++) { 
     $addr = &$values[$i]; 
     array_push($temp, $addr); 
    } 
    call_user_func_array(array($stmt, "bind_param"), $temp); 
    } else { 
    return true; 
    } 
} 

我仍然得到這個警告:

PHP Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given 

與錯誤以下:

Execute failed on update: (2031) No data supplied for parameters in prepared statement 

我沒有使用任何框架對於PHP,我如何創建一個引用數組來解決這個問題?

+1

我不認爲我們在這裏得到完整的圖片...你在哪裏調用' - > bind_param()'方法 –

+0

除了@SamuelCook的建議,它將是非常有用的,看看什麼'$值'是'ie和數組或字符串'以及'$ temp'是如何使用的,推測是一個bind_param調用。 – TheDude

+0

請提供您調用bind_param()的代碼。否則,我們無法幫助你。 – iquellis

回答

0

我還是覺得我們這裏沒有全貌,但我認爲這足以形成足夠的答案。

聽起來好像你想要一個函數,它需要一個mysqli_stmtstring和一個array,因爲它是3個參數並返回一個參數化的SQL語句。在代碼的方法簽名看起來像

/** 
* Builds a parameterized Sql query from the provided statement, data type pattern and params array. 
* 
* @param string $stmt The query string to build a parameterized statement from 
* @param string $pattern The data type pattern for the parameters i.e. sssd for 3 strings and an interger. 
* @param array $params A sequential array of the parameters to bind to the statement. 
* 
* @return mysqli_stmt The parameter bound sql statement ready to be executed. 
*/ 
public function bind(string $stmt, string $pattern, array $params) : mysqli_stmt 

你會稱這樣的方法,例如

$stmt = bind(
    'INSERT INTO myTable (str_field, str_field_2, int_field) VALUES (?, ?, ?)', 
    'ssd', 
    ['val1', 'val2', 1337] 
); 
$result = $stmt->execute(); 

實現應該是微不足道,因爲這

public function bind(string $stmt, string $pattern, array $params) : mysqli_stmt { 
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world'); 
    $preparedStmt = $mysqli->prepare($stmt); 
    $preparedStmt->bind_param($pattern, ...$params); 
    return $preparedStmt; 
} 

當然,我會建議每次調用函數時都使用依賴注入而不是創建新的mysqli對象,並且應該對$ pattern和$ param計數進行一些錯誤檢查。仍然有很多我看不到,但我希望這會讓你走上正軌。

+0

這是一個很好的方法,但它不適合我,因爲我需要一個可以在動態環境下工作的函數來更新哪些字段。現在我剛剛做出了一個很不錯的'開關盒',但我完全希望有人能幫我解決我的問題。 順便說一句:感謝您的支持。 –

+0

您能否提供示例輸入和輸出以演示所需的行爲? – TheDude