Php 当两列的值相同时,SQL抛出错误

Php 当两列的值相同时,SQL抛出错误,php,mysql,Php,Mysql,如果不使用唯一ID就不存在记录,我想插入该记录,我在此处找到了答案: 就我而言,我有一张桌子: +----+---------+---------+---------+---------+-----------+-------------+-----------+ | ID | dRelIns | vRelIns | dRelDel | vRelDel | cRelAktiv | iRelDateiId | iRelKatId | +----+---------+---------+------

如果不使用唯一ID就不存在记录,我想插入该记录,我在此处找到了答案:

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

+----+---------+---------+---------+---------+-----------+-------------+-----------+
| 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。我检查id是否已经存在,如果不存在,我想插入一个新的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 NOW SELECT、用户“J”、“$\u POST[id]”、“$value”

有没有办法让它工作,或者我应该在PHP中进行2-3次SQL查询并手动检查id?

我怀疑$\u POST[id]和$value具有相同的值,因此您似乎选择了相同的列两次。这应该在代码中被抑制,所以您只能选择它一次——或者您应该给每个人一个别名,这样就不会发生这种情况

我不建议返回列名以数字开头的结果集——在某些数据库系统中,这是不允许的,除非它被引用。将字符串前缀作为别名,必要时以u结尾

因此,您的子选择字符串可能如下所示:

"SELECT * FROM (
    SELECT
        NOW(),
        USER(),
        'J',
        '{$_POST['id']}' AS val_1,
        '{$value}' AS val_2
) WHERE ..."
更重要的是,在代码中使用$_POST[id]将使您面临SQL注入漏洞——在使用数据之前始终要对其进行转义。更好的是,切换到MySQL PDO并使用参数化

最后,变量应该是$_POST['id']-PHP假设您指的是字符串索引,但如果您跳过引号,它将发出警告。打开“警告”,这样您就可以看到类似这样的错误。

我怀疑$\u POST[id]和$value具有相同的值,因此您似乎选择了相同的列两次。这应该在代码中被抑制,所以您只能选择它一次——或者您应该给每个人一个别名,这样就不会发生这种情况

我不建议返回列名以数字开头的结果集——在某些数据库系统中,这是不允许的,除非它被引用。将字符串前缀作为别名,必要时以u结尾

因此,您的子选择字符串可能如下所示:

"SELECT * FROM (
    SELECT
        NOW(),
        USER(),
        'J',
        '{$_POST['id']}' AS val_1,
        '{$value}' AS val_2
) WHERE ..."
更重要的是,在代码中使用$_POST[id]将使您面临SQL注入漏洞——在使用数据之前始终要对其进行转义。更好的是,切换到MySQL PDO并使用参数化


最后,变量应该是$_POST['id']-PHP假设您指的是字符串索引,但如果您跳过引号,它将发出警告。打开警告,这样您就可以看到类似这样的错误。

如果$\u POST[id]和$value的值不同,则可以正常工作,但如果它们相同,则会抛出错误。我理解为什么会有错误,但不知道如何纠正。列名不是一个数字,它只是一个临时表。据我所知,您的子选择实际上变成了SELECT*从SELECT NOW开始,用户'J','5','5',因此字符串数字被视为列名。在运行$sql之前,请尝试在屏幕上打印$sql,以查看它是否符合您的预期?是的,这就是问题所在,我的问题是如何在不使用此子选择的情况下重写查询。现在,我发现为每列提供一个别名可以解决我的问题。你能用这个子选择的一个简短例子来编辑你的答案吗?我在这里使用了val_1和val_2作为示例别名,因为我当然不知道什么名字合适。很高兴你修复了它。当$\u POST[id]和$value的值不同时,它工作正常,但当它们相同时,它会抛出一个错误。我理解为什么会有错误,但不知道如何纠正。列名不是一个数字,它只是一个临时表。据我所知,您的子选择实际上变成了SELECT*从SELECT NOW开始,用户'J','5','5',因此字符串数字被视为列名。在运行$sql之前,请尝试在屏幕上打印$sql,以查看它是否符合您的预期?是的,这就是问题所在,我的问题是如何在不使用此子选择的情况下重写查询。现在,我发现为每列提供一个别名可以解决我的问题。你能用这个子选择的一个简短例子来编辑你的答案吗?我在这里使用了val_1和val_2作为示例别名,因为我当然不知道什么名字合适。很高兴你修好了。警告!您的代码包含一个-您正在将原始、未过滤、未验证的用户输入直接传递到SQL字符串中。SQL注入是一种很好的方法。考虑一下,你可以使用。是的,我知道,但这并不是回答我的问题,所以这是一个评论,而不是答案。警告您的代码包含一个-您正在将原始、未过滤、未验证的用户输入直接传递到SQL字符串中。SQL注入是一种很好的方法。考虑一下,你可以使用。是的,我知道,但这并不是回答我的问题,所以这是一个评论,而不是答案。