gpt4 book ai didi

php - LAST_INSERT_ID() 来自存储过程的结果

转载 作者:行者123 更新时间:2023-11-29 03:05:52 25 4
gpt4 key购买 nike

我在 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 变量中获取输出参数(参见 the third example in manual)。


编辑:如果您收到消息“命令不同步;您现在无法运行此命令”,则表示您已打开无缓冲查询。这意味着您要么需要在两者之间读取结果,要么使用缓冲查询。为此,您可以在第一个查询之后但在运行下一个查询之前使用 $stmt->store_result()。查看更多详情 this thread .

关于php - LAST_INSERT_ID() 来自存储过程的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com