【发布时间】:2013-10-06 07:55:08
【问题描述】:
我已阅读 MySQL 错误列表,在其中发现,当您执行多个插入语句时,last_insert_id() 返回第一个 auto_increment-value。
(链接:http://bugs.mysql.com/bug.php?id=34319)
我的问题是,在我的代码中,我实际上只在执行了一些选择以获取嵌套集的值后才执行 1 次插入查询。但是即使我只有 1 个插入查询,last_insert_id() 仍然返回“0”作为 ID。你知道可能是什么问题吗? :)
$query = $this->prepare("
SELECT @myRight := c.Rgt FROM ".DB_PREFIX."C_Categories c
WHERE c.CategoryID = :cat_id;
UPDATE ".DB_PREFIX."C_Categories c1 SET c1.Rgt = c1.Rgt + 2 WHERE c1.Rgt >= @myRight;
UPDATE ".DB_PREFIX."C_Categories c2 SET c2.Lft = c2.Lft + 2 WHERE c2.lft > @myRight;
INSERT INTO ".DB_PREFIX."C_Categories
(CategoryName, MetaTag, Description, ParentID, Lft, Rgt)
VALUES (:cat_name, :cat_tag, :desc, :parent_id, @myRight, @myRight+1);
");
$params = array(
array('cat_name', $data['name'], 'STR'),
array('cat_tag', $data['metatag'], 'STR'),
array('desc', $data['description'], 'STR'),
array('parent_id', $data['parentid'], 'INT'),
array('cat_id', $parent_id, 'INT')
);
$this->exec($query, $params);
$id = $this->lastInsertId();
return $id;
【问题讨论】:
-
你能像这样将多个语句放在一个查询中吗?
-
嗯,它没有给我任何错误 - 它完全按照我的意愿执行 INSERT 查询,所以是的,我很确定,我可以:)
-
@andrewsi stackoverflow.com/questions/6346674/…
-
@h2ooooooo - 我什至还没有喝过一天中的第一杯咖啡,但我已经学到了一些东西。谢谢你的链接!
-
@denlau 是的 - 这应该是可能的 AFAIC。只要您在此期间不重新连接到数据库(在相同的 PHP 代码中)。也就是说,我不知道在数据库连接中使用 keepalives 是否意味着这些变量是共享的(如果您同时收到两个请求)。我会检查一下以确保。 (一些睡眠魔法和多个请求应该告诉您它是否适用于单个会话,即使您可能使用保持活动/重新连接)。 Here's the MySQL manual page。 用户定义的变量是特定于会话的
标签: php pdo lastinsertid multi-query