我正在尝试制作一个程序,该程序将检查用户是否已经登录(他有一个会话,我正在检查他的最后一次行动是否超过15分钟)。我的程序如下:
CREATE PROCEDURE `isLogged`(in p_sessid VARCHAR(32), out res INT(1))
BEGIN
DECLARE v_customer_id INT(9);
DECLARE v_date DATE;
SELECT customer_id INTO v_customer_id FROM Sessions WHERE sessid=p_sessid;
SELECT expiry_date INTO v_date FROM Sessions WHERE sessid=p_sessid;
SET res=3;
IF v_customer_id > 0 THEN
IF UNIX_TIMESTAMP(NOW()) > UNIX_TIMESTAMP(v_date) THEN
DELETE FROM Sessions WHERE sessid=p_sessid;
SET res=1;
ELSE
UPDATE Sessions SET expiry_date=DATE_ADD(NOW(), INTERVAL 15 MINUTE) WHERE customer_id=v_customer_id;
SET res=0;
END IF;
END IF;
END
任何人都可以告诉,为什么它总是返回1,是什么意味着用户不再登录?我正在手动检查表达式UNIX_TIMESTAMP(NOW())> UNIX_TIMESTAMP(v_date),它给出了0作为响应,所以?这是怎么回事?
提前致谢, 马尔钦
答案 0 :(得分:2)
第一个IF语句应如下所示:
UNIX_TIMESTAMP(NOW()) > UNIX_TIMESTAMP(DATE_ADD(v_date, INTERVAL 15 MINUTE))
或者NOW总是大于上次登录日期。
答案 1 :(得分:0)
您可以重写/优化您的程序以发挥作用。例如 -
CREATE FUNCTION `isLogged`(IN p_sessid VARCHAR(32))
RETURNS INT
BEGIN
DELETE FROM Sessions WHERE sessid = p_sessid AND v_date <= NOW() - INTERVAL 15 MINUTE;
IF ROW_COUNT() > 0 THEN -- check how many rows were deleted
RETURN 1;
ELSE
UPDATE Sessions SET expiry_date = NOW() + INTERVAL 15 MINUTE WHERE customer_id = v_customer_id;
IF ROW_COUNT() > 0 THEN -- check how many rows were updated
RETURN 0;
END IF;
END IF;
RETURN 3;
END
此外,您可以尝试debug您的代码来理解错误。
答案 2 :(得分:0)
存在类型不匹配。 v_date类型是DATE,这只是一天!喜欢2011-12-14。
<强>解决方案:强>
更改日期 - &gt; DATETIME。
现在一切都很好。 无论如何,谢谢你的答案。