我正在使用準備好的語句將一篇文章寫入數據庫。有一些可選字段,如果留空,則不應將其寫入數據庫。這就是爲什麼我想使用動態準備的語句。我已經在這裏找到了一些關於SO的答案,並且一般來說解決方案是使用call_user_func_array()
。但這似乎不起作用。動態生成的MySQLI準備好的語句不起作用
代碼:
//generating query
$art_str = 'INSERT INTO table SET ';
$art_str.= 'col1=?';
$art_str.= ', col2=?';
$art_str.= ', col3=?';
$art_stmt_params = array(); //array with parameters for binding
$art_stmt_params[] = 'sss'; //$types
//obligated parameters (already been checked)
$art_stmt_params[] = $_POST['par1'];
$art_stmt_params[] = $_POST['par2'];
$art_stmt_params[] = $_POST['par3'];
//$articleParagraphs is an Array. Correctly generated and checked
if(isset($articleParagraphs)){
$art_str.= ', col4=?'; //expanding query
$art_stmt_params[0].= 's'; //adding type
$art_stmt_params[] = json_encode($articleParagraphs); //adding parameter to array
}
if(!empty($_POST['par5'])){
$art_str.= ', col5=?';
$art_stmt_params[0].= 's';
$art_stmt_params[] = $_POST['par5'];
}
if(!empty($_POST['par6'])){
$art_str.= ', col6=?';
$art_stmt_params[0].= 's';
$art_stmt_params[] = $_POST['par6'];
}
$art_stmt = $mysqli->prepare($art_str); //$mysqli is correct
call_user_func_array(array($art_stmt, 'bind_param'), $art_stmt_params);
$art_stmt->execute();
$art_stmt->close();
上面的代碼不會產生任何錯誤。而且,遵循上述代碼的代碼也可以正確執行。但沒有任何內容寫入數據庫。一切都是正確的:列名,表名,數據庫連接,已發佈的參數。然而,當我在call_user_func_array()
上執行var_dump()
時,它會打印NULL
。此外,我在同一頁面上使用準備好的語句,將一些元數據寫入數據庫。由於這裏的參數總是相同的,所以我沒有在這裏使用動態準備的語句,但$stmt->bind_param(...)
。我希望你能幫助我解決這個問題。謝謝!
ps。這是一個使用準備好的語句(它已經有一段時間,因爲我一直在sql'ing)
你期待什麼樣的答案? –
@YourCommonSense如果我的代碼有問題或者爲什麼沒有寫入數據庫, – LuudJacobs
所以,你希望有人讀你的代碼,並在腦海中執行它,注意到所有的執行錯誤 - 對嗎? –