簡體   English   中英

LAST_INSERT_ID()來自存儲過程的結果

[英]LAST_INSERT_ID() result from stored procedure

我在mysql中有一個存儲過程,該過程將更新很多行,然后插入一個(具體的分層數據結構)。 除了最后一個我設置@insert_id變量的代碼外,不必過多看代碼。

CREATE DEFINER=`root`@`localhost` PROCEDURE `addTaskNextTo`(IN `prev_id` INT, IN `pid` INT, IN `name` VARCHAR(100), IN `type` TINYINT, IN `uid` INT, IN `starting_date` DATE, IN `description` TEXT, OUT `insert_id` INT)
MODIFIES SQL DATA
BEGIN
    SELECT @myRight := rgt FROM tasks WHERE id = prev_id;
    UPDATE tasks SET rgt = rgt + 2 WHERE rgt > @myRight AND pid = pid;
    UPDATE tasks SET lft = lft + 2 WHERE lft > @myRight AND pid = pid;
    INSERT INTO tasks(pid, name, lft, rgt, type, uid, starting_date, description)
          VALUES(pid, name, @myRight + 1, @myRight + 2, type, uid, starting_date, description);
    SET @insert_id = LAST_INSERT_ID();
END

現在,當我從phpMyAdmin執行此過程時,它返回正確的最后一個ID,但是當我從php調用它時,它從先前插入的行中返回ID。 可能是問題所在,還有什么更好的方法建議您應該這樣做。

這就是我從PHP調用它的方式:

$sql = "CALL addTaskNextTo($last_tid, $pid, '$task_name', 0, $uid, '$task_start', '$task_desc', @insert_id)";

這本身就是一個SELECT查詢,我得到1列“ insert_id”,其中一行帶有值,例如“ 120”,這是前一行當前未插入行的ID。

這是接收sql字符串並返回單個值的函數:

public static function get_single_value($sql) {
    global $db;
    $rez = $db->query($sql);
    return !empty($rez) ? mysql_result($rez,0) : false;
}

我不確定您的操作方式,但是您應該這樣做

$dbh->query("CALL addTaskNextTo($last_tid, $pid, '$task_name', 0, $uid, '$task_start', '$task_desc', @insert_id)");
$dbh->query("SELECT @insert_id"); 

請注意,您需要一個單獨的SELECT查詢來獲取插入ID的更新值。 否則,您只會得到舊的。

或者更好的是,類似:

$stmt = $dbh->prepare("CALL addTaskNextTo(?, ?, ?, ?, ?, ?, ?, @insert_id)");
$stmt->execute(array($last_tid, $pid, $task_name, 0, $uid, $task_start, $task_desc));
$dbh->query("SELECT @insert_id"); 

也可以使用bind直接將輸出參數包含在PHP變量中(請參見手冊中的第三個示例 )。


編輯:如果收到消息“命令不同步;您現在不能運行此命令”,則表示您已打開無緩沖查詢。 這意味着您要么需要在兩者之間讀取結果,要么使用緩沖的查詢。 為了解決這個問題,您可以在第一個查詢之后但在運行下一個查詢之前使用$stmt->store_result() 此線程中查看更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM