使用数组的mysqli的bind_param

时间:2017-02-21 16:56:51

标签: php mysqli

我正在尝试使用mysqli预处理语句将值插入数据库。将要插入的值在运行时会有所不同,因此我尝试使用变量而不是列出所有参数。我已经看到我可以使用call_user_func_array来实现这一点,但这似乎不起作用。

到目前为止,我的代码如下所示,尽管为了简单起见已大大减少和修改:

// 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 $ params,我会得到以下内容。

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的机器上试过这个并得到相同的结果,所以这项研究似乎得到了验证)

有人能够对此有所了解吗?

由于

1 个答案:

答案 0 :(得分:2)

你可以试试这个,发送对值的引用而不是真值:

    $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);