【问题标题】:PHP's PDO prepared INSERT statement: am I able to define if the insert was successful?PHP 的 PDO 准备 INSERT 语句:我能否定义插入是否成功?
【发布时间】:2015-01-18 01:02:39
【问题描述】:

我有以下代码:

$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";

如果插入的url 已存在于表中,则ON DUPLICATE KEY UPDATE 语句有效,但execute() 的返回值始终为TRUE。然而lastInsertId() 在这种情况下为零。我可以将此用作插入重复的指示,或者我可以在插入之前对 DB 再执行一次查询,但这两种方法对我来说都不好。

有没有更好的办法?

【问题讨论】:

    标签: php mysql pdo insert insert-update


    【解决方案1】:

    如果重复,则更新 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?

    【讨论】:

    • 我想要实现的主要目标不是找出我引用的哪一行而是插入更新。
    • 哦,对不起,我误解了这个问题,我编辑了答案
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!这对我来说很好。但在我的情况下,如果表中已经存在该行,则返回值为0(不是2)。你能说清楚并编辑你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2018-03-30
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2012-08-07
    相关资源
    最近更新 更多