php - 使用准备好的语句进行动态参数绑定
问题描述
在为我的站点构建准备好的语句时,我发现可以迭代很多冗余代码。mysqli::prepare
是一个非常直接的迭代,但是当我到达mysqli::bind_param
and时mysqli::bind_result
,我遇到了以下问题组合:
1) 我不知道有多少参数mysqli::bind_param
2) 使用extract(Array)
参数mysqli::bind_param
将不起作用,因为参数mysqli::bind_param
是通过引用传递的
3)EXTR_REF
标志extract(Array)
也无济于事,因为传递的元素的值本身不能作为参考。
在这一点上,我已经放弃并正在使用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;
}
}
推荐阅读
- angular - Ngrx 实体,如何定义动作以及如何正确命名具有效果的动作
- azure - 如何在本地调试 EventHubTrigger?
- ios - 如何在 IOS cordva 应用程序中添加 cordova 插件?
- visual-studio - F#双击文件在VS中创建一个副本
- bash - 如何确保在使用 Ubuntu SSH 的路径上正确找到应用程序
- c# - 从缓冲区数组创建 jpeg 图像
- android - android app 以编程方式安装 targetSDK 24 , compileSDK 28 , minSDK 19
- google-apps-script - 修改 Google Cloud Datastore API 请求的响应大小
- c++ - 存储指向专用模板函数的指针的值
- javascript - 反应错误:插件/预设文件不允许导出对象,只有功能