我有条件地使用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 回答
您的查询看起来完全搞砸了,尤其是在您的
EXISTS
子查询中 . 你从tickets
中选择MyTbl.ColA
???我的建议是简单地在
MyTbl (ColA, ColB)
上添加一个唯一约束 .然后,您的
INSERT
将失败,并且可以在PDOException
中捕获唯一的约束违规 .要解决错误消息're seeing... it' s,因为您没有区分
INSERT
表和子查询表 .