MYSQL插入PDO不存在的位置

时间:2014-02-19 01:38:20

标签: php mysql pdo insert

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

我收到以下错误:

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

PHP代码如下:

我准备了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问题完全相关的问题。

  1. PDO can only execute one statement at a time
  2. Same error, seems to be a different source
  3. PDO variables inside a select followed by a Where statement
  4. 非常感谢!


    回答

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

1 个答案:

答案 0 :(得分:3)

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

中选择tickets

我的建议是在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;
        }
    }
}

要解决您看到的错误消息...这是因为您没有区分INSERT表和子查询表。