2013-09-30 87 views
1

我已經閱讀了MySQL-bug列表,在那裏我發現,last_insert_id()在執行多個插入語句時返回FIRST auto_increment-value。執行多個查詢時檢索last_insert_id

(鏈接:http://bugs.mysql.com/bug.php?id=34319

我的問題是,在我的代碼,我其實只是我已經進行了一些選擇後得到的值我的嵌套組進行1個插入查詢。但last_insert_id()仍然返回「0」作爲ID,即使我只有1個插入查詢。你知道可能是什麼問題嗎? :)

$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; 
+1

你可以在這樣的單個查詢中放置多個語句嗎? – andrewsi

+0

嗯,它不會給我任何錯誤 - 它執行完全按照我想要的INSERT查詢,所以是的,我很確定,我可以:) – denlau

+3

@andrewsi http://stackoverflow.com/questions/6346674/pdo-support-for-multiple-queries-pdo-mysql -pdo-mysqlnd – h2ooooooo

回答

-1

您可以創建一個#tempTable,把last_insert_ids在那裏和方法/步驟結束時,您可以返回該表。

希望它有幫助。

+0

你碰巧讀過這個問題嗎? –

0

您可以使用存儲過程來完成所有這些工作嗎?像這樣?

DELIMITER // 

CREATE PROCEDURE spUpdateAndInsertCategory (
    IN cat_id INT, 
    IN parent_id INT, 
    IN cat_name VARCHAR(100), 
    IN cat_tag VARCHAR(100), 
    IN cat_desc VARCHAR(100), 
    OUT lastInsertId INT 
) 
BEGIN 

    SELECT @myRight := c.Rgt FROM C_Categories c 
    WHERE c.CategoryID = cat_id; 

    UPDATE C_Categories c1 SET c1.Rgt = c1.Rgt + 2 WHERE c1.Rgt >= @myRight; 
    UPDATE C_Categories c2 SET c2.Lft = c2.Lft + 2 WHERE c2.lft > @myRight; 

    INSERT INTO C_Categories 
     (CategoryName, MetaTag, Description, ParentID, Lft, Rgt) 
     VALUES (cat_name, cat_tag, cat_desc, parent_id, @myRight, @myRight+1); 

    SELECT lastInsetId AS SELECT MAX(cat_id) from C_Categories; 

END //