PDO 最后插入 id 返回 0

Posted

技术标签:

【中文标题】PDO 最后插入 id 返回 0【英文标题】:PDO last insert id return 0 【发布时间】:2014-02-14 05:00:34 【问题描述】:

我面临最后一个插入 id 的问题,这是我的表结构

CREATE TABLE `user` (                                     
          `id` int(30) NOT NULL AUTO_INCREMENT,                   
          `fbtoken_id` varchar(255) DEFAULT NULL,                 
          `user_name` varchar(255) DEFAULT NULL,                  
          `email` varchar(50) NOT NULL,                           
          `city` varchar(50) DEFAULT NULL,                        
          `created` datetime DEFAULT NULL,                        
          `modified` datetime DEFAULT NULL,                       
          `fbuserid` varchar(255) DEFAULT NULL,                   
          PRIMARY KEY (`id`),                                     
          KEY `id` (`id`)                                         
        ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1  

$stmt = $this->core->dbh->prepare("INSERT INTO user(fbtoken_id,user_name,email,city,created,modified,fbuserid)
VALUES(:fbtoken_id,:first_name,:email,:location,:created,:modified,:fbuserid)");

$stmt->execute(array(':fbtoken_id' => $access_token, ':first_name' => $first_name, ':email' => $email, ':location' => $location,
':created' => $datetime, ':modified' => $datetime,':fbuserid' => $fbuserid));

$_SESSION['userid']=$this->core->dbh->lastInsertId();
$affected_rows = $stmt->rowCount();
echo 'userid', $_SESSION['userid'];

这里我将最后一个插入 ID 设置为会话,并为他的所有事务使用用户 ID。在我的本地测试中,我正确获取了最后一个插入 ID。一切都很完美。但是当我将代码上传到服务器时,有时会话未设置或最后一个插入 ID 为 0。我不明白如何在实时服务器中复制该问题。

使用 last insertid 或任何其他替代方法来获取新用户 ID 是否正确?

我看到在某些情况下使用

$this->core->dbh->beginTransaction();
  last insert id 
$this->core->dbh->commit();

需要这段代码吗?

请帮我调试一下情况。在此先感谢

//编辑

$stmt = $this->core->dbh->prepare("INSERT INTO user(fbtoken_id,user_name,email,city,created,modified,fbuserid)
VALUES(:fbtoken_id,:first_name,:email,:location,:created,:modified,:fbuserid)");
$this->core->dbh->beginTransaction();
$stmt->execute(array(':fbtoken_id' => $access_token, ':first_name' => $first_name, ':email' => $email, ':location' => $location,
':created' => $datetime, ':modified' => $datetime,':fbuserid' => $fbuserid));

$_SESSION['userid']=$this->core->dbh->lastInsertId();
$affected_rows = $stmt->rowCount();
echo 'userid', $_SESSION['userid'];
 $this->core->dbh->commit();

【问题讨论】:

【参考方案1】:

最后一个插入 ID 在提交后将不起作用 - 它需要在提交发生之前执行。因手指滑落而编辑。所以如果你想使用 lastinsert id - 你需要在代码中控制事务。

【讨论】:

我阅读了手册,但这里没有使用 commit(),没有提交我得到正确的最后插入 id。我也尝试过提交()。我在获取最后一个插入 ID 后使用了 commit()。它也正常工作。 你的意思是在本地,在服务器上一次也没用? 它在本地服务器上工作,我从来没有遇到过任何问题,在现场它也可以工作。但是对于某些用户,当我签入数据库时​​,他们的会话 ID 是 0。我还不能复制这个问题吗?是会话的问题还是最后一个插入 id 的问题? 我在考虑没有被包裹在交易中,一切都在空中:php.net/manual/en/pdo.transactions.php 我已经编辑了我的问题以包括开始事务和提交。没事吧?

以上是关于PDO 最后插入 id 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

如何获取最后插入的ID,以及PDO列的名称?

使用 PDO 准备好插入后获取最后一个插入 ID

PDO 获取多个插入 ID

php PDO - 如何获取最后插入的ID?

PDO LastInsertId 不返回任何内容

在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?