我有条件地使用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表和子查询表之间进行区分.
标签:php,mysql,pdo,insert 来源: https://codeday.me/bug/20191013/1906040.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。