php - 将php数组键显式映射到数据库列(oracle)
问题描述
我以数组的形式将数据从 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 => '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)";
..........
此外,损坏的字符失败,即上面的key6
- 那么我如何将传入的数组键映射到显式匹配我的 oracle db 表中的列名?*
(同时保持我的 MERGE INTO WHEN MATCHED INSERT 结构在下面?) sry sql noob ...
解决方案
使用按位置访问 PHP 数组的代码,您需要在数组上添加一些 PHP 验证,以确保它具有正确数量的数组条目 - 并且它们的顺序正确。
然后使用绑定变量select :1, :2,...
而不是字符串插值select '${data[0]}'...
。这将降低 SQL 注入安全风险并提高性能和可扩展性。它还应该有助于解决一些无效字符问题,尽管您的输入数据清理应该进行一些验证以帮助停止插入垃圾。
如果您尝试更新列但未传递任何值(表示不应进行更改),则可能需要从更新语句中删除该列。您可能需要动态生成 SQL 语句。有点不清楚您受到什么限制,以及您要达到什么目标。
我猜想无效的 SQL 例如缺少的 WHEN NOT MATCHED THEN 子句就在 StackOverflow 片段中。https://stackoverflow.com/help/minimal-reproducible-example会很好。
推荐阅读
- python - 从 python 模块返回变量
- javascript - React axios response.json 不是函数
- python - 使用带有默认值的 SQL-ALCHEMY 插入行 Postgresql
- apache - 我应该怎么做才能修复 Apache 上的 HTTP 请求走私?
- java - 即使在 Eclipse 中进行 Maven 更新后也无法导入依赖项
- ubuntu-18.04 - 如何修复出现在 Eclipse 中的 ns3 的“程序”/waf“未在 PATH 中找到”错误?
- windows - 自动将特定文件类型从一个文件夹移动到另一个文件夹
- java - 使用java反射实现list类的findByXXX方法是否可取?
- java - 使用“AES/CFB/NoPadding”在 Java 中加密和使用 AES.MODE_CFB 在 Python 中解密会产生不同的结果
- arrays - 为什么 set.average 返回的值与 array.average 不同?