我已经在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?你的......皮埃尔
答案 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。