php PDO lastInsertId()用于重复密钥更新时返回0?

1hdlvixo  于 2023-02-07  发布在  PHP
关注(0)|答案(3)|浏览(107)

我有一个如下的查询:

$a = $members->prepare("insert into a(name) values(:name) 
                            on duplicate key update name = :name");

当我这么做的时候:
$insert_id = $a->lastInsertId()
如果查询成功地插入了一行,它将返回预期的插入id,如果它更新了一行,它也将返回预期的更新行id(差不多),但是如果因为一切都是一样的,它既没有插入也没有更新任何东西,那么它只返回0。
我想这是非常合乎逻辑的默认行为,但是有没有办法改变它,以便它可以返回它试图更新的行的id,就像它实际上改变了行中的某些内容一样。
谢谢。

osh3o9ms

osh3o9ms1#

有很多地方可以找到这个问题的答案,但是PDO的特异性可能会阻碍你的搜索结果...
首先,确保将id=LAST_INSERT_ID(id)添加到ON DUPLICATE子句中,如the DOCS底部所示,这里的id是主键的列名(因此在您的情况下,它的标题可能是id,也可能不是)。
此外,您可能需要为->lastInsertId()指定一个序列对象参数才能使其工作,我以前在某些情况下遇到过这个问题。

pxy2qtax

pxy2qtax2#

否,因为没有它“尝试”更新的行。另外,请注意:如果在同一会话中在此之前插入了另一个查询,则可以从上一个查询中获得LAST_INSERT_ID()值。

7tofc5zh

7tofc5zh3#

下面是一段代码来补充已接受的答案,使用LAST_INSERT_ID(id)就可以达到目的,将PDO::lastInsertId()返回的值设置为更新行的值。

$dbh->query("create table users (
    user_id int primary key auto_increment, 
    user_name varchar(255), 
    user_email varchar(255) unique)"
);

$sql = 'INSERT INTO users (
        `user_name`, 
        `user_email` 
    ) VALUES (
        ?, 
        ? 
    ) ON DUPLICATE KEY UPDATE
       `user_id` = LAST_INSERT_ID(`user_id`), 
       `user_name` = VALUES(user_name),
       `user_email` = VALUES(user_email);
';
//note user_id is the primary column of the users table 
$sth = $dbh->prepare($sql);
// inserting the new record with id=1
$statement = $sth->execute( array('test', 'test@gmail.com') );
echo $dbh->lastInsertId();
// inserting the new record with id=2
$statement = $sth->execute( array('test', 'test1@gmail.com') );
echo $dbh->lastInsertId();
// updating the record with id=1 that does a change
$statement = $sth->execute( array('test2', 'test@gmail.com') );
echo $dbh->lastInsertId();
// updating the record with id=1 that doesn't do any changes
$statement = $sth->execute( array('test2', 'test@gmail.com') );
echo $dbh->lastInsertId();

它返回预期的1211

相关问题