我正在使用预准备语句将文章写入数据库。有一些可选字段,如果留空则不应写入DB。这就是我想使用动态准备语句的原因。我已经在SO上找到了一些答案,一般来说解决方案是使用call_user_func_array()
。但这在某种程度上似乎并没有起作用。
代码:
//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();
上面的代码不会产生任何错误。并且遵循上述代码的代码也正确执行。但没有任何内容写入数据库。一切都是正确的:列名,表名,数据库连接,发布的参数。当我在var_dump()
上执行call_user_func_array()
时,会打印NULL
。此外,我在同一页面上使用之前准备好的语句,将一些元数据写入数据库。由于这里的参数总是相同的,我在这里没有使用动态预处理语句,但是$stmt->bind_param(...)
。我希望你能帮我解决这个问题。谢谢!
PS。这是我第一次使用准备好的语句(自从我一直在使用sql时已经有一段时间了)
答案 0 :(得分:0)
代表OP发表:
通过为可选参数和if(){}elseif(){}elseif
的每种可能组合创建$art_stmt->bind_param(...)
,我设法解决了这个问题。现在它有效。我仍然不知道call_user_func_array()
为什么不起作用。