PHP的PDO编写INSERT语句:我能否定义插入是否成功?

时间:2014-11-20 08:35:13

标签: php mysql pdo insert insert-update

我有以下代码:

$add_rq = $DBH->prepare('INSERT INTO `table` SET `url` = :url ON DUPLICATE KEY UPDATE `url`=`url`');
if($add_rq->execute(['url' => $url]))
  echo "Added (id: ".$DBH->lastInsertId().")";
else
  echo "Not added";

如果表中已存在插入urlON DUPLICATE KEY UPDATE语句有效,但execute()的返回值始终为TRUE。但是在这种情况下lastInsertId()为零。我可以使用它作为插入重复的指示,或者我可以在插入之前再向DB执行一次查询,但这两种方法对我来说都很糟糕。

还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用$add_rq->rowCount()。根据{{​​3}}中的评论,如果插入了新行,则会返回1,如果现有行已更新,则会2。但显然这是错误的,如果更新了一行,它会返回0

execute()仅在因错误而失败时才返回false。

答案 1 :(得分:0)

如果ID重复,则更新ID

然后lastInsertId()将在更新后返回id(而不是0) 它将在插入后以任意方式返回id

INSERT INTO `table` SET `url` = :url ON DUPLICATE KEY UPDATE `url`=`url`, id=LAST_INSERT_ID(id)

现在即使没有插入新行,也会返回id

$DBH->lastInsertId()

要查明是否有插入更新,您可以添加另一个名为“updated”的列,默认值为0,然后在更新时应将列设置为1

INSERT INTO `table` (`url`) VALUES (?) ON DUPLICATE KEY UPDATE `url`=?, `updated`=`updated`+1

来源:它在mysql手册http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.htm的底部提到了 MySQL ON DUPLICATE KEY - last insert id?