动态生成的MySQLI预处理语句不起作用

时间:2014-02-24 18:19:26

标签: php mysql

我正在使用预准备语句将文章写入数据库。有一些可选字段,如果留空则不应写入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时已经有一段时间了)

1 个答案:

答案 0 :(得分:0)

代表OP发表:

通过为可选参数和if(){}elseif(){}elseif的每种可能组合创建$art_stmt->bind_param(...),我设法解决了这个问题。现在它有效。我仍然不知道call_user_func_array()为什么不起作用。