[英]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.