这个简短的程序有什么问题(MySQL)

时间:2011-12-12 15:03:27

标签: mysql function session procedure

我正在尝试制作一个程序,该程序将检查用户是否已经登录(他有一个会话,我正在检查他的最后一次行动是否超过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作为响应,所以?这是怎么回事?

提前致谢, 马尔钦

3 个答案:

答案 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)

Omg,这非常愚蠢。

存在类型不匹配。 v_date类型是DATE,这只是一天!喜欢2011-12-14。

<强>解决方案:

更改日期 - &gt; DATETIME。

现在一切都很好。 无论如何,谢谢你的答案。