在为我的网站构建准备好的语句时,我发现可以迭代大量冗余代码。 mysqli::prepare
是一个非常直接的迭代,但是当我到达 mysqli::bind_param
和 mysqli::bind_result
时,我遇到了以下问题组合:
1) 我不知道mysqli::bind_param中有多少参数
2) 在mysqli::bind_param
的参数中使用extract(Array)
将不起作用,因为mysqli::bind_param
的参数code> 通过引用传递
3) extract(Array)
上的 EXTR_REF
标志也无济于事,因为传递的元素的值本身不能是引用。
此时,我已经放弃并使用 eval()
。
$statements[
's_records_by_parent'=>[
'sql'=>
"select * from table where id=?",
'params'=>[
'"i"',
'$id'
]
],
];
foreach($statements as $name=>$statement){
if(!$name=$this->mysql->prepare(
$statement['sql']
))
{
echo"Error preparing statement $name.";
exit;
}
if(!eval("return \$name->bind_param(".implode(',',$statement['params']).");"))
{
echo"Error binding parameters for statement $name.";
exit;
}
}
上面的代码完全按照我想要的方式执行,除了有一个 eval()
语句,该语句最终将根据用户输入准备语句,这与我。
最佳答案
这是使用call_user_func_array()
的代码:
$statements[
's_records_by_parent'=>[
'sql'=>
"select * from table where id=?",
'params'=>[
'i',
'id'
]
],
];
foreach($statements as $name=>&$statement){
if(!$name=$this->mysql->prepare(
$statement['sql']
))
{
echo"Error preparing statement $name.";
exit;
}
foreach($statement['params']as$k=>$param)
if($k)$statement['params'][$k]=&$$param;
if(!call_user_func_array([$name,'bind_param'],$statement['params']))
{
echo"Error binding parameters for statement $name.";
exit;
}
}
关于php - 使用准备好的语句进行动态参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54181586/