我正在使用oci_bind_by_name()
。
oci_bind_by_name($stid, ":post1", $_POST['post1']);
oci_bind_by_name($stid, ":post2", $_POST['post2']);
oci_bind_by_name($stid, ":post3", $_POST['post3']);
oci_bind_by_name($stid, ":post4", $_POST['post4']);
...
是否可以在PHP中动态执行此操作,对于所有$_POST
键调用同名的oci_bind_by_name()
?
只是为了简化我的代码,因为我有大约50次调用oci_bind_by_name()
。
答案 0 :(得分:2)
可以使用密钥作为参数名称,在foreach
数组上使用$_POST
循环完成此操作:
// Bind all in a loop:
foreach ($_POST as $key => $value) {
oci_bind_by_name($stid, ":$key", $value);
}
但是,您不能保证客户端已经发送了您真正想要的POST密钥。然后,必须根据实际上有效用于预准备语句的键数组来检查它们:
$valid_keys = array(
'post1',
'post2',
...
...
'post99'
);
然后循环遍历那些,在尝试使用它们之前检查它们是否实际上是在POST中发送的。
foreach ($valid_keys as $key) {
if (!isset($_POST[$key])) {
// ERROR! Needed key was not present in $_POST!
// Break the loop if you can't execute the statement...
}
else {
oci_bind_by_name($stid, ":$key", $_POST[$key]);
}
}
如果您打算动态构建预准备语句的SQL字符串,则维护安全参数名称列表尤为重要。
答案 1 :(得分:1)
如果你确实使用一个简单的foreach循环来绑定每个变量;不要绑定到循环变量$ value
// Bind all in a loop: but DO NOT use $value
foreach ($_POST as $key => $value) {
oci_bind_by_name($stid, ":$key", $_POST[$key]);
}
引用手册Example 3 of oci_bind_by_name():
foreach ($ba as $key => $val) {
// oci_bind_by_name($stid, $key, $val) does not work
// because it binds each placeholder to the same location: $val
// instead use the actual location of the data: $ba[$key]
oci_bind_by_name($stid, $key, $ba[$key]);
}