mam nietypowy problem z procedurami składowanymi. Mianowicie:
1. Mam funkcję zaloguj, która tworzy Sesję. W sesjach jest id użytkownika, sesja i data wygaśnięcia. Data wygaśnięcia jest ustawiana na obecną plus 15 minut. Czyli jak zalogujemy się o 7:00, data wygaśnięcia będzie wynosiła 7:15.
2. Mam funkcję, która sprawdza, czy użytkownik jest zalogowany. Czyli sprowadza się to głównie do tego, żeby sprawdzić, czy obecna data jest większa, niż data wygaśnięcia. Np o 7:05 coś robimy, i sprawdzamy , czy 7:05 > 7:15. Jeżeli jest większa, sesja jest nieważna i użytkownik zostaje wylogowany. Jeżeli jest mniejsza, to znaczy że sesja nie wygasła, a data wygaśnięcia ustawia się na 7:05 + 15 min = 7:20. I tak to działa.
Napisałem sobie procedurę, i nie potrafię zrozumieć, gdzie jest błąd. Wygląda ona tak:
CREATE PROCEDURE `czyZalogowany`(IN p_sesja VARCHAR(32), out res INT(1)) BEGIN DECLARE v_id_klienta INT(9); DECLARE v_date DATE; SELECT id_klienta INTO v_id_klienta FROM Sesje WHERE sesja=p_sesja; SELECT data_wygasniecia INTO v_date FROM Sesje WHERE sesja=p_sesja; SET res=3; IF v_id_klienta > 0 THEN IF UNIX_TIMESTAMP(NOW()) > UNIX_TIMESTAMP(v_date) THEN DELETE FROM Sesje WHERE sesja=p_sesja; SET res=1; ELSE UPDATE Sesje SET data_wygasniecia=DATE_ADD(NOW(), INTERVAL 15 MINUTE) WHERE id_klienta=v_id_klienta; SET res=0; END IF; END IF; END
Czy ktoś jest w stanie stwierdzić, dlaczego taka procedura nie działa. ZAWSZE zwraca 1. Zawsze. Czy ją wywołamy minutę po logowaniu, czy godzinę. Nie robi to na niej żadnego wrażenia. Gdy przeglądam tabelę po zalogowaniu, wszystkie wartości są poprawne, data wygaśnięcia ustawia się poprawnie. Gdy sprawdzę z palca:
SELECT data_wygasniecia INTO @a FROM Sesje WHERE sesja='...';
SELECT UNIX_TIMESTAMP(NOW()) > UNIX_TIMESTAMP(v_date);
To dostaję odpowiedź 0. W takim razie przecież nie jest możliwe, aby ten fragment kodu (odpowiedzialny za usuwanie) został osiągnięty? Ja już pogłupiałem na czysto, nie wiem czy to ja mam jakąś pokręconą logikę czy z tym MySQLem jest coś nie tak.
Z góry dzięki za odpowiedzi,
Marcin
ps
Prosiłbym jakiegoś moderatora o przeniesienie postu do działu MySQL. Przez nieuwagę napisałem w złym dziale.
ps2
W sumie to można temat usunąć, ale można też zostawić dla kogoś (chociaż temat niewiele mówi o problemie). Otóż, v_date był typem DATA, więc tam się mieścił tylko dzień w formacie 2011-12-14. Nic nie było o godzinie. Dlatego zawsze było to 1, czyli niezalogowany. Niby głupi błąd, ale łatwo się pomylić. Powinien być typ DATETIME, wtedy działa ok.