gpt4 book ai didi

mysql - 我可以将多个准备好的语句放入 MySQL 的一个存储过程中吗?

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

示例代码:

BEGIN

PREPARE stmt_user_login FROM
"SELECT COUNT(*)
FROM `t_users`
WHERE `t_users`.`username` = ? AND `t_users`.`password` = ?;";

SET @a := $username;
SET @b := $password;

EXECUTE stmt_user_login USING @a, @b;

DEALLOCATE PREPARE stmt_user_login;

IF FOUND_ROWS() = '1' THEN

PREPARE stmt_user_loggedin FROM
"INSERT INTO
`t_sessions`
(`username`, `last_request`, `last_ip`, `last_port`, `token`, `validity`)
VALUES
(?, ?, ?, ?, ?, ?);";

SET @c := $user_name;
SET @d := $last_request;
SET @e := $last_ip;
SET @f := $last_port;
SET @g := $token;
SET @h := $validity;

EXECUTE stmt_user_loggedin USING @c, @d, @e, @f, @g, @h;

DEALLOCATE PREPARE stmt_user_loggedin;

END IF;

END

最佳答案

是的,您可以在存储过程中使用多个准备好的语句。

但这不是您程序中的问题。

FOUND_ROWS() 返回上一个查询返回的行数,而不是计数。在您的过程中,行数将始终为 1,即使它在上一个查询中报告的计数为 0。*

相反,您应该使用 SELECT ... INTO 来捕获值。

此外,您不需要使用准备好的语句在查询中安全地包含过程参数。你可以这样做:

BEGIN
DECLARE usercount INT;

SELECT COUNT(*) FROM t_users
WHERE t_users.username = $username AND t_users.password = $password
INTO usercount

IF usercount = 1 THEN

INSERT INTO t_sessions (username, last_request, last_ip, last_port, token, validity)
VALUES ($user_name, $last_request, $last_ip, $last_port, $token, $validity);

END IF;

END

我假设 $username$password 以及以 $ 为前缀的其他标识符是过程参数的名称。在 SQL 标识符上使用 $ 前缀是不常见的,但它是合法的。

您的程序甚至可以进一步简化:

BEGIN

INSERT INTO t_sessions (username, last_request, last_ip, last_port, token, validity)
SELECT $user_name, $last_request, $last_ip, $last_port, $token, $validity
FROM t.users WHERE t.users.username = $username AND t_users.password = password
LIMIT 1;

END

它的工作方式是,如果 SELECT 中有匹配项,它会返回一行,其中的列由那些 $ 前缀变量中的值填充。然后将该行插入到 t_sessions 中。如果没有匹配项,它会返回零行,因此不会发生 INSERT。


* 异常:FOUND_ROWS() 似乎在 SELECT COUNT(*) 查询上返回 0 如果查询使用 NULL 进行优化访问类型或“不可能的位置”,例如使用 WHERE 1=0。我记录了一个错误:http://bugs.mysql.com/bug.php?id=73283

还有更多,我发现针对 MySQL 5.6 的 FOUND_ROWS() 返回错误结果的许多其他错误报告。我不建议使用此功能。

关于mysql - 我可以将多个准备好的语句放入 MySQL 的一个存储过程中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725053/

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