首页 文章

MYSQL插入PDO不存在的位置

提问于
浏览
1

我有条件地使用PHP PDO命令将值插入MySQL数据库 . 条件指出如果要插入的行已存在,请不要插入它 . 如果它不存在,请插入该行 . 当我通过PHPmyadmin执行时,代码执行得很好,因此将PDO变量( :a:b )与静态数字交换 .

I am getting the following error:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name '0'' in...

The PHP code is as follows:

我准备了sql语句......

$InsertFoo = $pdo->prepare("

    INSERT INTO `MyTbl` (
                            `ColA`,
                            `ColB`
                            )
    SELECT * FROM ( SELECT :a, :b ) AS tmp
    WHERE NOT EXISTS (
        SELECT `MyTbl`.`ColA`
        FROM `MyTbl`
            WHERE `ColA` = :aa
            AND `ColB` = :bb
        )
    LIMIT 1

");

然后循环遍历数组以反复执行预准备语句 . (该数组之前使用SimpleXML生成,因此 -> . 如果您不熟悉SimpleXML,只需将 $foo->fooA 视为每个循环更改的变量 . )

foreach ($loopme as $foo) {

    // query to be executed for ticket insertion
    $TicketsToInsert->execute(array(
                                    a => $foo->fooA,
                                    b => $foo->fooB,
                                    aa => $foo->fooA,
                                    bb => $foo->fooB
                                    ));

}

任何建议都非常感谢:

作为旁注,有许多类似的问题,但我还没有找到任何与插入时的PDO问题完全一致的问题 .

非常感谢!


Answered

Phil提供了更简单的解决方案,即在多行中应用唯一约束,这反过来会拒绝在所述行中唯一的新插入行 . 这与测试即将插入的行的不存在相反 . 更多细节如下 .

1 回答

  • 3

    您的查询看起来完全搞砸了,尤其是在您的 EXISTS 子查询中 . 你从 tickets 中选择 MyTbl.ColA ???

    我的建议是简单地在 MyTbl (ColA, ColB) 上添加一个唯一约束 .

    ALTER TABLE MyTbl ADD UNIQUE (ColA, ColB);
    

    然后,您的 INSERT 将失败,并且可以在 PDOException 中捕获唯一的约束违规 .

    $stmt = $pdo->prepare('INSERT INTO MyTbl (ColA, ColB) VALUES (?, ?)');
    foreach ($loopme as $foo) {
        try {
            $stmt->execute([$foo->fooA, $foo->fooB]);
        } catch (PDOException $e) {
            $errorCode = $stmt->errorInfo()[1];
            if ($errorCode == 1586) {
                // I think 1586 is the unique constraint violation error.
                // Trial and error will confirm :)
            } else {
                throw $e;
            }
        }
    }
    

    要解决错误消息're seeing... it' s,因为您没有区分 INSERT 表和子查询表 .

相关问题