这个 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

参考: