0

以下のような配列の形式で、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...

4

1 に答える 1

-1

位置によって PHP 配列にアクセスするコードでは、配列に PHP 検証を追加して、正しい数の配列エントリがあること、およびそれらが正しい順序になっていることを確認する必要があります。

select :1, :2,...次に、文字列補間の代わりにバインド変数を使用しますselect '${data[0]}'...。これにより、SQL インジェクションのセキュリティ リスクが軽減され、パフォーマンスとスケーラビリティが向上します。また、無効な文字の問題のいくつかにも役立つはずですが、入力データのサニタイズでは、ガベージの挿入を防ぐためにいくつかの検証を行う必要があります。

列を更新しようとしたが値が渡されなかった場合 (変更を加えてはならないことを示しています)、更新ステートメントからその列を削除する必要がある場合があります。SQL ステートメントを動的に生成する必要がある場合があります。どのような制約があり、何を達成しようとしているのかが少し不明確です。

WHEN NOT MATCHED THEN 句が欠落しているなどの無効な SQL は、StackOverflow スニペットに含まれていたと思います。https://stackoverflow.com/help/minimal-reproducible-exampleがよかったでしょう。

于 2020-11-19T01:09:56.490 に答える