2017-02-21 79 views
1

我想使用mysqli准备语句插入值到数据库中。插入的值在运行时会有所不同,所以我尝试使用变量而不是列出所有参数。我已经看到我可以使用call_user_func_array来实现这一点,但这似乎不起作用。mysqli的bind_param使用数组

到目前为止我的代码是下面,虽然大大降低,修改简单:

// 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 $参数,可以得到类似如下。

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的机器上尝试过并获得相同的结果,因此这项研究似乎已得到验证)

是否有人能够阐明这一点?

感谢

+0

值得一提的是,PDO使这相当容易,因为'的execute()'接受一个数组参数,没有花哨的舞蹈要求。 – tadman

+0

检查服务器日志,你的解决方案应该工作,需要找到错误 – bxN5

+0

你也有一个答案等着你,看到这一点。检查查询上的错误,并在错误报告 –

回答

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); 
+0

这很好地工作。我不完全确定为什么,但它工作。谢谢你的帮助 – Typhoon101

相关问题