2016-03-22 49 views
0

随着mysqli的最后插入的ID可以从准备好的语句对象进行检索,例如:PHP PDO最后插入编号

$pstm->execute(); 
$pstm->insert_id; 

然而,随着PDO这有在数据库级别做。例如:

$lastId = $dbh->lastInsertId(); 

我虽然该PDO是为了取代mysql/mysqli,为什么这个设计决定呢?如果两个插入命令同时运行会怎么样?由于插入的ID不是作用域给定的命令可能它检索错误的ID?

由于

+3

它仍然是con nection based –

+1

我假设'mysqli'只是在运行每个查询后抓住它,但PDO让你自己抓住它。 – tadman

+2

你不能比较pdo到mysql。 pdo是独立于数据库的, –

回答

1

MySQL的LAST_INSERT_ID功能被维持在会话(数据库连接)电平。不在个别准备好的声明。该函数返回

作为最近执行的INSERT语句的结果,第一个自动生成的值已成功插入AUTO_INCREMENT列。


“我认为,PDO是为了替代在MySQL/MySQLi”

我认为PDO本来是一个替代到mysql_和mysqli_接口。 PDO与其中任何一个都有很大的不同。首先,除了MySQL之外,还有许多数据库的PDO数据库驱动程序(例如DB2,Oracle,PostgreSQL,SQL Server等)。

相比之下,mysqli_接口专门支持MySQL(和MariaDB的版本< 10.0,以及可能的其他几个人是MySQL的兼容。)


“为什么要采取这样的设计决策?”

我认为PDO设计更贴近地遵循MySQL数据库本身的LAST_INSERT_ID函数的模式。 PDO和mysqli都提供了“包装器”功能,作为执行和检索SELECT LAST_INSERT_ID()语句的结果集的便捷方式。

我相信PDO的开发者打算将它作为一个轻量级且一致的多数据库接口。创建一个替代mysql/mysqli的drop并不是主要的设计目标。


“如果两个插入命令同时运行会怎样?”

在单个MySQL数据库会话上“同时”运行两个INSERT语句是不可能的。他们会连续运行。

在MySQL中,检索从第一个INSERT语句的AUTO_INCREMENT值,即第一条语句将需要随后被执行SELECT LAST_INSERT_ID()之前第二INSERT语句。


“因为插入的ID没有范围的给定的命令可以将其检索错误ID?”

这是通过设计MySQL LAST_INSERT_ID()函数。它不是“特定范围”的特定陈述。该函数返回的值将为会话维护。

而mysqli接口为会话级别的LAST_INSERT_ID()函数提供了一个包装。

参考:http://php.net/manual/en/mysqli.insert-id.php

至于提供作准备语句的方法/函数,我从来没有使用的。

我怀疑是在准备好的声明中,insert_id功能真的是一个封装/中继的功能,在会议上(或链接,mysqli的是指它。)

如果是这样的话,这意味着在执行任何其他INSERT语句之前,需要在执行准备语句INSERT后立即调用insert_id

(我真的不知道任何关于这一点。这是可能的mysqli的开发人员实现自动运行,紧跟在准备好的声明INSERT成功执行的SELECT LAST_INSERT_ID()语句代码,并且缓存,前执行调用返回值,然后当insert_id函数被调用时,它会返回缓存的值,但我不认为是这种情况,但它可能是如果是这样的话,我仍然不会依赖我的代码我想在INSERT之后立即获取LAST_INSERT_ID(),然后在MySQL会话中运行任何其他语句之前