这个 if/then 存储过程有什么问题?
what's wrong with this if/then stored proc?
我不清楚什么时候需要你使用 @ 来引用 mySQL 中的变量。我来自 MS SQL,您总是在其中使用它,但显然在 mySQL 中不正确。
所以下面的存储过程总是执行第一个 IF 块,即使会话值已过期 - 因为它总是执行更新语句。显然,我能找到的唯一用于 mySQL 存储过程的调试工具在 Windows 和 Linux 上运行。我在 Mac。呜呜呜。
是的。谁能看出这里出了什么问题?谢谢!
DELIMITER $$
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256))
BEGIN
DECLARE sessId INT DEFAULT NULL;
SELECT sessId = id FROM UserSessions
WHERE userId = uid
AND sessionToken = token
AND expires > INTERVAL 2 MINUTE + NOW() ORDER BY expires DESC LIMIT 1;
IF sessId IS NOT NULL THEN
UPDATE UserSessions
SET expires = INTERVAL 2 HOUR + NOW()
WHERE id = sessId;
ELSE
DELETE FROM UserSessions
WHERE userId = uid
AND sessionToken = token;
SET @sessId = 0;
END IF;
SELECT sessId;
END
为了记录在伪代码中它应该做什么:
if we have a session for this user, with a matching token which has not expired {
update the expiration time to 2 hours from now
return the session id;
}
else {
delete the (now stale) session
return 0;
}
提前致谢。
您没有设置 sessId
的值...您在查询中进行比较。
我想你需要的是这样的:
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256))
BEGIN
DECLARE sessId INT DEFAULT NULL;
SELECT id
INTO sessId -- Here is the assignment
FROM UserSessions
WHERE userId = uid
AND sessionToken = token
AND expires > INTERVAL 2 MINUTE + NOW()
ORDER BY expires DESC
LIMIT 1;
IF sessId IS NOT NULL THEN
UPDATE UserSessions
SET expires = INTERVAL 2 HOUR + NOW()
WHERE id = sessId;
ELSE
DELETE FROM UserSessions
WHERE userId = uid
AND sessionToken = token;
SET sessId = 0;
END IF;
SELECT sessId;
END
参考:
我不清楚什么时候需要你使用 @ 来引用 mySQL 中的变量。我来自 MS SQL,您总是在其中使用它,但显然在 mySQL 中不正确。
所以下面的存储过程总是执行第一个 IF 块,即使会话值已过期 - 因为它总是执行更新语句。显然,我能找到的唯一用于 mySQL 存储过程的调试工具在 Windows 和 Linux 上运行。我在 Mac。呜呜呜。
是的。谁能看出这里出了什么问题?谢谢!
DELIMITER $$
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256))
BEGIN
DECLARE sessId INT DEFAULT NULL;
SELECT sessId = id FROM UserSessions
WHERE userId = uid
AND sessionToken = token
AND expires > INTERVAL 2 MINUTE + NOW() ORDER BY expires DESC LIMIT 1;
IF sessId IS NOT NULL THEN
UPDATE UserSessions
SET expires = INTERVAL 2 HOUR + NOW()
WHERE id = sessId;
ELSE
DELETE FROM UserSessions
WHERE userId = uid
AND sessionToken = token;
SET @sessId = 0;
END IF;
SELECT sessId;
END
为了记录在伪代码中它应该做什么:
if we have a session for this user, with a matching token which has not expired {
update the expiration time to 2 hours from now
return the session id;
}
else {
delete the (now stale) session
return 0;
}
提前致谢。
您没有设置 sessId
的值...您在查询中进行比较。
我想你需要的是这样的:
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `validate_session`(uid INT, token VARCHAR(256))
BEGIN
DECLARE sessId INT DEFAULT NULL;
SELECT id
INTO sessId -- Here is the assignment
FROM UserSessions
WHERE userId = uid
AND sessionToken = token
AND expires > INTERVAL 2 MINUTE + NOW()
ORDER BY expires DESC
LIMIT 1;
IF sessId IS NOT NULL THEN
UPDATE UserSessions
SET expires = INTERVAL 2 HOUR + NOW()
WHERE id = sessId;
ELSE
DELETE FROM UserSessions
WHERE userId = uid
AND sessionToken = token;
SET sessId = 0;
END IF;
SELECT sessId;
END
参考: