首页 > 解决方案 > 将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 ...

标签: phpsqloraclestored-proceduresvariable-binding

解决方案


使用按位置访问 PHP 数组的代码,您需要在数组上添加一些 PHP 验证,以确保它具有正确数量的数组条目 - 并且它们的顺序正确。

然后使用绑定变量select :1, :2,...而不是字符串插值select '${data[0]}'...。这将降低 SQL 注入安全风险并提高性能和可扩展性。它还应该有助于解决一些无效字符问题,尽管您的输入数据清理应该进行一些验证以帮助停止插入垃圾。

如果您尝试更新列但未传递任何值(表示不应进行更改),则可能需要从更新语句中删除该列。您可能需要动态生成 SQL 语句。有点不清楚您受到什么限制,以及您要达到什么目标。

我猜想无效的 SQL 例如缺少的 WHEN NOT MATCHED THEN 子句就在 StackOverflow 片段中。https://stackoverflow.com/help/minimal-reproducible-example会很好。


推荐阅读