我在 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;
}