1

如果不使用唯一 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',如果不存在,我想插入一个新的。如果某些条目存在但不在列表中,我想将 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)时,它会抛出一个错误Duplicate column name '5'因为SELECT * FROM (SELECT NOW(), USER(), 'J', '$_POST[id]','$value')

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

4

1 回答 1

1

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

我不建议返回列名以数字开头的结果集——在某些不允许的数据库系统中,除非它被引用。给他们字符串前缀作为别名,_<number>如果必须的话以结尾。

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

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

更重要的是,$_POST[id]在您的代码中包含 SQL 注入漏洞会让您面临 SQL 注入漏洞 - 始终在使用数据之前对其进行转义。更好的是,切换到 MySQL PDO 并使用参数化。

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

于 2013-01-07T10:45:42.800 回答