1

一意の ID を使用せずにレコードが存在しない場合はレコードを挿入したいのですが、ここでこの回答を見つけました: MySQL: テーブルに存在しない場合はレコードを挿入します

私の場合、テーブルがあります:

+----+---------+---------+---------+---------+-----------+-------------+-----------+
| ID | dRelIns | vRelIns | dRelDel | vRelDel | cRelAktiv | iRelDateiId | iRelKatId |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 1  |  blabla |  blabla |  NULL   |  NULL   |    J      |      3      |     5     |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 2  |  blabla |  blabla |  blabla |  blabla |    N      |      3      |     1     |
+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 3  |  blabla |  blabla |  NULL   |  NULL   |    J      |      3      |     2     |
+----+---------+---------+---------+---------+-----------+-------------+-----------+

ID iRelKatIdとID iRelDateiIdの配列 ($_POST) を取得しています。ID が既に存在するかどうかを確認し、cRelAktiv = 'J' でない場合は、新しい ID を挿入します。エントリが存在するがリストにない場合は、cRelAktiv を「N」に設定します。

SQLクエリを使用した私のPHPスクリプト:

$list=implode("','", $_POST["kat"]);
        $sql="UPDATE tabRel_UDK SET dRelDel=NOW(),
                                    vRelDel=USER(),
                                    cRelAktiv='N'
                                WHERE iRelDateiId='$_POST[id]' AND cRelAktiv='J' AND iRelKatId NOT IN('$list')";
        $result =  mysql_query($sql) or die(Error (" . mysql_error() . ").");

        foreach ($_POST["kat"] as $value) {
            $sql="INSERT INTO tabRel_UDK (dRelIns, vRelIns, cRelAktiv, iRelDateiId, iRelKatId)
                SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value') AS tmp
                WHERE NOT EXISTS (
                SELECT iRelDateiId,iRelKatId,cRelAktiv FROM tabRel_UDK 
                WHERE iRelDateiId = '$_POST[id]' AND iRelKatId='$value' AND cRelAktiv='J') LIMIT 1;";
            $result =  mysql_query($sql) or die("Error (" . mysql_error() . ").");
        }

このスクリプトは私にとっては機能しますが、両方の ID が同じ値 (たとえば 5) の場合、重複した列名 '5' というエラーがスローされます。SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value')

それを機能させる方法はありますか、または2〜3個のSQLクエリを作成し、PHPでIDを手動で確認する必要がありますか?

4

1 に答える 1

1

$_POST[id]同じ値を$value持っていると思われるため、同じ列を2回選択しているようです。これはコードで抑制して、一度だけ選択する必要があります。または、これが起こらないように、それぞれにエイリアスを与える必要があります。

いずれにせよ、数値で始まる列名を持つ結果セットを返すことはお勧めしません。一部のデータベース システムでは、引用されていない限り許可されません。必要に応じて末尾に文字列のプレフィックスをエイリアスとして付けます_<number>

したがって、副選択文字列は次のようになります。

"SELECT * FROM (
    SELECT
        NOW(),
        USER(),
        'J',
        '{$_POST['id']}' AS val_1,
        '{$value}' AS val_2
) WHERE ..."

さらに重要なこと$_POST[id]は、コードに含まれていると、SQL インジェクションの脆弱性が発生する可能性があります。使用する前に常にデータをエスケープしてください。さらに良いことに、MySQL PDO に切り替えてパラメータ化を使用します。

最後に、変数は次のようにする必要があり$_POST['id']ます。PHP は文字列インデックスを意味していると想定しますが、引用符をスキップすると警告が発生します。このような間違いを確認できるように、警告をオンにします。

于 2013-01-07T10:45:42.800 に答える