从最后插入的行获取最后插入 id

Posted

技术标签:

【中文标题】从最后插入的行获取最后插入 id【英文标题】:Get last insert id from last inserted row 【发布时间】:2013-12-11 18:28:25 【问题描述】:

我又来了,我快疯了! 我有这个存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `aggiungi_categoria`(IN   `id_categoria_principale` INT, IN `nome_categoria` VARCHAR(150), IN `sigla_categoria`    VARCHAR(10), IN `stato_categoria` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY   DEFINER
begin

select @rgt := rgt,@lft := lft from categorie where id = id_categoria_principale;

if @rgt - @lft = 1 then

UPDATE categorie SET rgt = rgt + 2 WHERE rgt > @lft;
UPDATE categorie SET lft = lft + 2 WHERE lft > @lft;

insert into categorie (nome,sigla,stato,lft,rgt)
values(nome_categoria,sigla_categoria,stato_categoria,@lft+1,@lft+2);

 ELSE

 UPDATE categorie SET rgt = rgt + 2 WHERE rgt > @rgt-1;
 UPDATE categorie SET lft = lft + 2 WHERE lft > @rgt-1;

 insert into categorie (nome,sigla,stato,lft,rgt) values
(nome_categoria,sigla_categoria,stato_categoria,@rgt,@rgt+1);

 end if;


 end

我怎样才能得到最后一个插入ID???我尝试了所有,没有参数或在表上使用 max(id) 或“set last_id = last_insert_id()”进行选择,但我不知道如何通过 php 获取它?

当我在 phpmyadmin 中调用该过程时,我得到了类似的东西

@rgt:=number,@lft:=number2

显然在 php 中我在数组中得到了相同的结果。

我做错了什么?

【问题讨论】:

mysql_insert_id() 在 PHP 中不起作用? (或 $mysqli->insert_id 如果你使用 MySQLi) 是 MySQL 数据库吗?如果是这样,您使用的是什么扩展,即 mysql、mysqli、pdo 等? @RossWilson 是的,反正我用的是 mysqli 【参考方案1】:

您应该能够使用mysql_insert_id‎ 来获取最后一个插入语句的 id。 参考:http://php.net/mysql_insert_id‎

但是,mysql_* 函数现在已被弃用(请阅读下文),您应该使用等效的 mysqli_* 函数或方法。上述函数的等价物是:$mysqli->insert_id() 参考:http://www.php.net/manual/en/mysqli.insert-id.php

mysql_* 类别的函数已被弃用,警告在此转载:

此扩展自 PHP 5.5.0 起已弃用,并将在 未来。相反,MySQLi 或 PDO_MySQL 扩展 应该使用。另请参阅MySQL: choosing an API 指南和 related FAQ 了解更多信息。此功能的替代品 包括:

mysqli_insert_id() PDO::lastInsertId()

【讨论】:

是的,很抱歉我想告诉你我正在使用 mysqli,我的 db 类中有函数返回 $mysqli->insert_id() 但它不起作用,结果为 0。相反,当我执行插入查询(不调用过程)时,它可以工作 @MarcoC 如果您在下面查看我的回答,我相信它会对您有所帮助。 @RossWilson 谢谢,但在我的情况下它不起作用,因为我在过程中使用了“插入”。所以我都尝试了,(在这种情况下)我的答案是正确的。但是,您的答案是正确的,但只是在您按照建议执行插入命令时。【参考方案2】:

如果您使用的是 MySQLi,那么您将拥有类似的东西。

程序:

$link = mysqli_connect($db_host, $db_user, $db_pass, $db_table);

$query = "INSERT INTO table VALUES($val, $val2, $val3)";
mysqli_query($link, $query);
$id = mysqli_insert_id($link);

OOP:

$mysqli = new mysql($db_host, $db_user, $db_pass, $db_table);

//query
$id = $mysqli->insert_id;

希望这会有所帮助!

如果您有任何问题,请告诉我。

【讨论】:

【参考方案3】:

好的,我解决了!

我添加了一个名为 last_id 的 int 输出参数, 在结束标记之前我包含了这个声明:

select last_insert_id() into last_id;

在 PHP 中我执行:

$db -> execQuery('call aggiungi_categoria('.$parametri['id_categoria_principale'].',"'.$parametri['nome'].'","'.$parametri['sigla'].'",'.$parametri['stato'].',@lastId);');

最后

$lid = $db ->execQuery('select @lastId;');

【讨论】:

以上是关于从最后插入的行获取最后插入 id的主要内容,如果未能解决你的问题,请参考以下文章

使用php获取最后插入的行

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

如何在 SQLite 中获取最后插入的行 guid?

Symfony 2 - 从表中获取最后插入的行

php 从最后插入的行获取特定值

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