【问题标题】:mysqli's bind_param using an arraymysqli的bind_param使用数组
【发布时间】:2017-07-11 10:28:36
【问题描述】:

我正在尝试使用 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 的机器上都试过了,得到了相同的结果,所以这项研究似乎得到了验证)

有人能解释一下吗?

谢谢

【问题讨论】:

  • 值得注意的是,由于 execute() 采用数组参数,因此 PDO 使这变得相当容易,不需要花哨的舞蹈。
  • 检查服务器日志,您的解决方案应该可以工作,需要找到错误
  • 你也有答案等着你,看吧。检查查询错误并报告错误
  • that answer 下面的作品。如果您尝试了它但仍然无法正常工作,那么您在某处有错误并且可能存在索引问题。顺便说一句,你离开这个问题只是为了在未来的某个日期回来吗?您已获得 cmets 和答案,但没有任何回应。
  • @Roman “你的解决方案应该可以工作” - 实际上它不会工作,他们应该得到以下错误:Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given...。下面伊万的回答就是解决这个问题。

标签: php mysqli


【解决方案1】:

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

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

【讨论】:

  • 效果很好。我不完全确定为什么,但它奏效了。感谢您的帮助
  • 我的说Warning: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object 我使用了准确的代码!! PHP-7,WAMP
猜你喜欢
  • 2015-09-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多