явно сопоставить ключи массива php с столбцами db (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...

1 ответ

С кодом, который обращается к массиву PHP по позиции, вам нужно будет добавить некоторую проверку PHP на массив, чтобы убедиться, что он имеет правильное количество записей массива - и что они находятся в правильном порядке.

Затем используйте переменные привязки select :1, :2,... вместо строковой интерполяции select '${data[0]}'.... Это снизит риски безопасности внедрения SQL-кода и повысит производительность и масштабируемость. Это также должно помочь с некоторыми проблемами с недопустимыми символами, хотя при очистке входных данных должна выполняться некоторая проверка, чтобы помочь остановить вставку мусора.

Если вы пытаетесь обновить столбец, но не получили никакого значения (что указывает на то, что никаких изменений вносить не следует), вам может потребоваться удалить этот столбец из оператора обновления. Возможно, вам потребуется динамически сгенерировать инструкцию SQL. Немного неясно, какие ограничения вы испытываете и чего пытаетесь достичь.

Я предполагаю, что недопустимый SQL, например, отсутствующее предложение WHEN NOT MATCHED THEN, было просто во фрагменте Stackru. https://stackru.com/help/minimal-reproducible-example было бы хорошо.

Другие вопросы по тегам