Что не так с этой короткой процедурой (MySQL) - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь создать процедуру, которая будет проверять, зарегистрирован ли уже пользователь (он получил сеанс, и я проверяю, было ли его последнее действие более 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 в ответ, так? В чем дело?

Спасибо заранее, Marcin

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Первый оператор IF должен выглядеть следующим образом:

UNIX_TIMESTAMP(NOW()) > UNIX_TIMESTAMP(DATE_ADD(v_date, INTERVAL 15 MINUTE))

, иначе NOW всегда будет больше, чем дата последнего входа.

0 голосов
/ 14 декабря 2011

Омг, это было очень глупо.

Произошло несоответствие типов. Тип v_date был DATE, и это всего лишь день! Как 2011-12-14.

Решение:

изменить DATE -> DATETIME.

И теперь все работает хорошо. В любом случае, спасибо за ответы.

0 голосов
/ 12 декабря 2011

Вы можете переписать / оптимизировать вашу процедуру для работы. Например -

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 

Кроме того, вы можете попробовать отладить ваш код, чтобы понять ошибку.

...