я использую 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()
,
Это может быть просто сделано с 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 оператора, особенно важно поддерживать список безопасных имен параметров.
Если вы используете простой цикл 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]);
}
Цитировать из руководства Пример 3 из 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]);
}