Oracle绑定所有$ _POST

时间:2014-09-24 17:14:56

标签: php oracle post

我正在使用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()

2 个答案:

答案 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]);
}