将php数组键显式映射到db列(oracle)
我以数组的形式将数据从PHP传递到sql,如下所示:将php数组键显式映射到db列(oracle),php,sql,oracle,stored-procedures,variable-binding,Php,Sql,Oracle,Stored Procedures,Variable Binding,我以数组的形式将数据从PHP传递到sql,如下所示: var_dump($data); array( key_id => 'CLA-ARTCC'(length=9) key2 => 'ZLA'length=3) key3 => 'LOS ANGELES ACTCC'(length=17) key4 => 'ACTCC'(length=5) key5 => 'DEA'(length=3) key6 => '255
var_dump($data);
array(
key_id => 'CLA-ARTCC'(length=9)
key2 => 'ZLA'length=3)
key3 => 'LOS ANGELES ACTCC'(length=17)
key4 => 'ACTCC'(length=5)
key5 => 'DEA'(length=3)
key6 => '2555 East Avenue 'P''(length=20)
...
)
我已经开始这样的sql逻辑;它在某些情况下可以工作,但非常容易出错,例如,如果上面的数组发送时带有“ACTCC
”,则只需将“DEA
”值推送到“ACTCC
”数据库列中即可
例如,如果在key5
(不需要对列进行更改或更新)下推送数组时没有任何值;相反,它将传入的key6
中的值作为${data[4]}
<?php
.................
$ds = $_POST['data']; // incoming arrays
$fd = json_decode($ds, true);
foreach ($fd as $data) {
array_values($data)
$sql = "MERGE INTO app.table a
using (SELECT '${data[0]}' key_id,
'${data[1]}' key2,
'${data[2]}' key3,
'${data[3]}' key4,
'${data[4]}' key5,
'${data[5]}' key6,
FROM dual) p
ON ( a.key_id= p.key_id )
WHEN matched THEN
UPDATE SET a.key2= p.key2,
a.key3= p.key3,
a.key4= p.key4,
a.key5= p.key5,
INSERT (key_id,
key2,
key3,
key4,
key5,
key6)
VALUES (p.key_id,
p.key2,
p.key3,
p.key4,
p.key5,
p.key6)";
..........
对于按位置访问PHP数组的代码,您需要在数组上添加一些PHP验证,以确保它具有正确数量的数组条目,并且它们的顺序正确
然后使用绑定变量select:1,:2,
而不是字符串插值select'${data[0]}'…
。这将降低SQL注入安全风险,并有助于提高性能和可扩展性。它还应该有助于解决一些无效字符问题,不过输入数据清理应该进行一些验证,以帮助停止插入垃圾
如果您试图更新列,但未传递任何值(表示不应进行任何更改),则可能需要从update语句中删除该列。您可能需要动态生成SQL语句。有点不清楚你正处于什么样的约束之下,以及你正试图实现什么
我猜无效的SQL语句,例如missing WHEN NOT MATCHED THEN子句就在StackOverflow代码段中。A会很好的