Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO如何知道MySQL中最后插入的id?_Php_Mysql_Doctrine_Pdo_Communication Protocol - Fatal编程技术网

Php PDO如何知道MySQL中最后插入的id?

Php PDO如何知道MySQL中最后插入的id?,php,mysql,doctrine,pdo,communication-protocol,Php,Mysql,Doctrine,Pdo,Communication Protocol,编辑:这个问题的标题原本是:Doctrine如何知道MySQL中最后一个插入的id?和地图绘制者有关。经过一番挖掘,我发现这个问题与条令无关,而是与PDO_MySQL、MySQL C API以及最终与MySQL客户机-服务器的通信有关。我已决定更改标题,因此可能有人会找到他/她的问题的答案 对于那些不使用教义的人:我很好奇,为什么要吼叫: mysql_query("INSERT INTO category (name) VALUES('cat')"); echo mysql_insert_id(

编辑:这个问题的标题原本是:Doctrine如何知道MySQL中最后一个插入的id?和地图绘制者有关。经过一番挖掘,我发现这个问题与条令无关,而是与PDO_MySQL、MySQL C API以及最终与MySQL客户机-服务器的通信有关。我已决定更改标题,因此可能有人会找到他/她的问题的答案

对于那些不使用教义的人:我很好奇,为什么要吼叫:

mysql_query("INSERT INTO category (name) VALUES('cat')");
echo mysql_insert_id();
或类似:

$pdo->exec("INSERT INTO category (name) VALUES('cat')");
echo $pdo->lastInsertId();
只会导致日志中的一个位置(没有单独的
选择最后一次插入\u ID()
):

原始问题:

我有两张桌子:

category(id,name)
product(id, name, categoryId)
我创建了新的类别对象和产品对象。我将类别对象指定给产品对象。我没有设置任何ID:

$product = new Product();
$product->name = 'asdf';

$category = new Category();
$category->name = 'cat';

$product->Category = $category;
之后,我刷新了连接并检查了MySQL日志:

1684 Query  START TRANSACTION
1684 Query  INSERT INTO category (name) VALUES ('cat')
1684 Query  INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
1684 Query  COMMIT

条令如何知道,新创建的类别id是312?日志中没有其他内容。

可能通过调用

last\u insert\u id
仅适用于
自动增量
列。如果您在
自动增量
列中手动插入一个值,它将不起作用

这个原则会起作用,因为它就像给它分配一个
NULL
(尽管你从来没有专门写过)。这将触发自动递增,并为
last\u insert\u id()
提供一个值

我已经包括了一个jpg在这里,以便您可以看到它。希望有帮助


我做了一些研究并浏览了一些源代码,所以我的答案可能有点错误,也不准确

首先,这实际上与学说无关。条令使用PDO_MYSQL。但是内部PDO_MYSQL使用与
MYSQL_insert_id
function-native MYSQL C API function-
MYSQL_insert_id
相同的东西

没有单独的
SELECT LAST\u INSERT\u ID()
的原因在于,在执行语句后(在我的示例中是
INSERT
),服务器用数据和OK数据包中包含的一些其他内容进行响应,包括
INSERT\u ID
。因此,当我们启动
mysql\u insert\u id()
时,我们没有连接到服务器,要接收
insert\u id
-mysql库不需要这样做-它已经存储了上次执行查询时的这个值(至少在分析文件
libmysql.c
后我这样认为)


OK数据包在这里被描述:

但这会反映在日志中,不是吗?@Pekka一个未经教育的猜测:日志可以配置为不写入
SELECT
s吗?@jensgram可以-或者可以配置为显示函数调用的结果(即
LAST\u INSERT\u ID()
)。我不知道查询日志是如何工作的,我已经做了类似于
INSERT-INTO-foo2(id,text)值(LAST_INSERT_id(),'text')和我在日志中有字符串
LAST\u INSERT\u ID()…
,而不是ID本身的值。@prostynick您是否尝试过简单的
选择
?你也能在日志中找到这个吗?但这并不能解释条令是如何实际检索值的。没有检索最后一个插入id的查询。此答案与问题无关。这就是为什么我们可以使用它,而不必担心查询竞争。非常感谢。
1684 Query  START TRANSACTION
1684 Query  INSERT INTO category (name) VALUES ('cat')
1684 Query  INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
1684 Query  COMMIT