2017-02-21 75 views
1

我想使用mysqli準備語句插入值到數據庫中。插入的值在運行時會有所不同,所以我嘗試使用變量而不是列出所有參數。我已經看到我可以使用call_user_func_array來實現這一點,但這似乎不起作用。mysqli的bind_param使用數組

到目前爲止我的代碼是下面,雖然大大降低,修改簡單:

// in the real world, these will be set dynamically 
$table = 'my_table'; 
$sql_fields = 'field_1,field_2,field_3,field_4'; 
$sql_types = 'ssss'; 
$sql_holders = '?,?,?,?'; 
$data = array('value_1', 'value_2', 'value_3', 'value_4'); 

$stmt = $con->prepare("INSERT INTO $table ($sql_fields) VALUES ($sql_holders)"); 
$params = array_merge(array($sql_types), $data); 
call_user_func_array(array($stmt, "bind_param"), $params); 

如果我的var_dump $參數,可以得到類似如下。

array(5) { 
    [0]=> 
    string(4) "ssss" 
    [1]=> 
    string(7) "value_1" 
    [2]=> 
    string(7) "value_2" 
    [3]=> 
    string(7) "value_3" 
    [4]=> 
    string(7) "value_4" 
} 

這一切對我來說似乎都沒問題,但是當我運行腳本時,PHP崩潰了。我可以註釋掉「call_user_func_array」這一行,它可以工作。顯然沒有發生,但它不會崩潰。

除了我使用PHP 7,PhpStorm IDE和WAMP,我恐怕對自己的環境瞭解不多。當PHP崩潰時,我得到PhpStorm錯誤「CLI已停止工作」。我的研究告訴我,這個錯誤是PHP崩潰而不是IDE,所以問題應該與我的代碼。 (順便說一下,我已經在兩臺運行PhpStorm的機器上嘗試過並獲得相同的結果,因此這項研究似乎已得到驗證)

是否有人能夠闡明這一點?

感謝

+0

值得一提的是,PDO使這相當容易,因爲'的execute()'接受一個數組參數,沒有花哨的舞蹈要求。 – tadman

+0

檢查服務器日誌,你的解決方案應該工作,需要找到錯誤 – bxN5

+0

你也有一個答案等着你,看到這一點。檢查查詢上的錯誤,並在錯誤報告 –

回答

1

你可以試試這個,送參考值而不是實際值:

$params = array_merge(array($sql_types), $data); 
    foreach($params as $key => $value) { 
     $params[$key] = &$params[$key]; 
    } 
    call_user_func_array(array($stmt, "bind_param"), $params); 
+0

這很好地工作。我不完全確定爲什麼,但它工作。謝謝你的幫助 – Typhoon101

相關問題