当两列具有相同值时,SQL会引发错误

时间:2013-01-07 10:40:50

标签: php mysql

我想插入一条记录,如果它没有使用唯一ID就不存在,我在这里找到了这个答案:MySQL: Insert record if not exists in table

就我而言,我有一张桌子:

+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 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 的数组($ _POST)和另一个ID iRelDateiId 的数组。我检查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)时,由于SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value') 重复列名'5' >

任何想法如何使它工作,或者我应该做2-3个SQL查询并在PHP中手动检查ID?

1 个答案:

答案 0 :(得分:1)

我怀疑$_POST[id]$value具有相同的值,因此您似乎选择了相同的列两次。这应该在代码中被禁止,所以你只选择它一次 - 或者你应该给每个别名,所以这不会发生。

除非引用,否则我建议不要在某些数据库系统中返回一个以数字开头的结果集 - 在某些数据库系统中是不允许的。给它们字符串前缀作为别名,如果必须,以_<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假定您的意思是字符串索引,但如果跳过引号则会引发警告。打开警告,这样你就可以看到这样的错误。