PHP-MYSQL插入不存在PDO

我有条件地使用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问题的问题.

> PDO can only execute one statement at a time
> Same error, seems to be a different source
> PDO variables inside a select followed by a Where statement

非常感谢!

回答

Phil提供了一种在多个行上应用唯一约束的简单得多的解决方案,这反过来会拒绝在所述行中唯一的新插入的行.这与测试将要插入的行的不存在相反.下面有更多详细信息.

解决方法:

您的查询看起来完全混乱了,尤其是在您的EXISTS子查询中.您正在从票证中选择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;
        }
    }
}

解决您所看到的错误消息,这是因为您没有在INSERT表和子查询表之间进行区分.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...