2014-02-24 123 views
0

我正在使用準備好的語句將一篇文章寫入數據庫。有一些可選字段,如果留空,則不應將其寫入數據庫。這就是爲什麼我想使用動態準備的語句。我已經在這裏找到了一些關於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)

+0

你期待什麼樣的答案? –

+0

@YourCommonSense如果我的代碼有問題或者爲什麼沒有寫入數據庫, – LuudJacobs

+0

所以,你希望有人讀你的代碼,並在腦海中執行它,注意到所有的執行錯誤 - 對嗎? –

回答

0

發佈代表OP的我第一次:

我已經設法解決它,通過爲每個創建if(){}elseif(){}elseif可選的參數組合和$art_stmt->bind_param(...)。現在它可以工作。我仍然不知道爲什麼call_user_func_array()沒有工作。

+0

感謝您添加它作爲答案。儘管這不是一個真正的答案,而是一個古怪的解決方法。 – LuudJacobs

+0

沒關係 - 請記住,因爲我們在這裏有一個數據API,並且標誌指定問題得到解答,所以最好將答案存儲爲答案。雖然,據我所知,沒有'is_quirky'布爾字段':-p'。 – halfer