调用存储过程后从php访问LAST_INSERT_ID()

时间:2009-03-13 09:11:00

标签: php mysql stored-procedures

我已经在mysql中定义了一个存储过程(让我们称之为 proc_create_node(parent INT))来进行插入。

当我从mysql cli调用它时,执行以下操作就可以了:

CALL proc_create_node(12);
SELECT LAST_INSERT_ID();

我得到最后一个插入的id:

+------------------+
| LAST_INSERT_ID() |
+------------------+
|               15 | 
+------------------+

现在,当我从php调用这些行时,或者如果我使用 mysql_insert_id() php函数,我总是回来 0

我错过了什么?我怎么能在php中获得最后一个插入的id?

你的......皮埃尔

3 个答案:

答案 0 :(得分:1)

它在这里工作:

$link = mysql_connect('localhost', 'root', '');
if (!$link) {
   die('Not connected : ' . mysql_error());
}

$db_selected = mysql_select_db('test', $link);
if (!$db_selected) {
   die ('Can\'t use test : ' . mysql_error());
}
$result = mysql_query('CALL blub(12)');
if (!$result) {
   die('Invalid query: ' . mysql_error());
}
$result = mysql_query('SELECT LAST_INSERT_ID()');
if (!$result) {
   die('Invalid query: ' . mysql_error());
}

print_r(mysql_fetch_assoc($result));

打印一个递增的整数。 mysql 5.1.30和php 5.2.9-1。

所以问题必须在你的php代码中,在你的存储过程中(你是从PHP传递有效参数吗?)还是在你的php或mysql版本中(那里恰好有一些bug)。

btw:将SELECT LAST_INSERT_ID()替换为mysql_insert_id()在这里工作。

答案 1 :(得分:1)

它可能与数据库连接有关 - LAST_INSERT_ID()函数不是基于每个连接工作吗?

您是否认为将SELECT LAST_INSERT_ID()添加到存储过程并修改存储过程以返回所述ID是个好主意?

答案 2 :(得分:1)

在此处查看mysqli_multy_query的使用情况:http://ua.php.net/manual/en/mysqli.multi-query.php

此功能旨在与您的多语句查询一起使用。但是要使用它你需要通过php_mysqli模块而不是通过php_mysql,如果你支持旧的应用程序,这不是很简单。

第二 - 您可以将SELECT LAST_INSERT_ID()放入存储过程并在执行结果中接收它。

这两种方式都值得尝试,但第二种方法很简单,可以使用php_mysql。