Rozdział 15. ♦ Generowanie statystyk 403
działania addStatRecord będzie wartość 0. Jeśli natomiast wywołanie mysq1_query zakończy się sukcesem, wynikiem działania addStatRecord będzie wartość zwrócona przez funkcję mysql_insert_id.
Funkcja mysql_in$ert_id zwraca, wygenerowany automatycznie w kolumnie typu AUT0_ INCREMENT, identyfikator ostatnio wprowadzonego rekordu. Dzięki temu dowiemy się, jaki identyfikator został nadany wierszowi wprowadzonemu przez ostatnio wykonane zapytanie. Zapamiętanie tej wartości będzie bardzo ważne, o czym przekonamy się w dalszej części rozdziału.
Napiszemy teraz funkcje, które pozwolą na pobranie danych określających, ilu użytkowników odwiedziło w danym czasie nasz serwis. Pierwsza funkcja o nazwie getKnownUsers określi liczbę zarejestrowanych użytkowników, natomiast druga, getAl 1 Users — liczbę niezarejestrowanych użytkowników (ściślej użytkowników, którzy się nie zalogowali). Zacznijmy od funkcji getKnownUsers. Jej zadaniem będzie wykonanie zapytania SQL, które pobierze żądaną przez nas informację z bazy, oraz zwrócenie wyniku tego zapytania.
Funkcja będzie przyjmowała jeden argument o nazwie timeout, określający czas (w minutach), którego ma dotyczyć zliczanie liczby osób załogowanych na stronie. Gdybyśmy zatem chcieli się dowiedzieć, ile osób było na witrynie w ciągu ostatnich pięciu minut, funkcji należałoby przekazać wartość 5. Aby pobrać taką informację z bazy, należy po prostu policzyć liczbę wierszy w tablicy Stats, które w kolumnie Data zawierają czas nie starszy niż timeout minut oraz które w kolumnie Userld zawierają wartość różną od zera (jak pamiętamy, użytkownik o identyfikatorze 0 oznacza osobę, która się nie zalogowała na stronie). Ten drugi warunek jest bardzo prosty, przybierze on postać: Userld o 0
Pierwszy warunek sprawi nam nieco więcej kłopotu. Powinien mieć schematyczną postać:
Data > Czas_bieżący - timeout minut
Pytanie, jak określić Czas_bieżący - timeout minut? Na szczęście SQL oferuje nam funkcję NOWO, pobierającą aktualny czas (wykorzystywaliśmy ją już w funkcji addStatRecord) oraz funkcję DATE_SUB, która potrafi odjąć od dowolnej daty dowolny czas. Jej wywołanie ma schematyczną postać:
DATE_SUB(0ata. INTERVAL Ile Typ)
gdzie Data określa datę i czas, od których zostanie odjęta wartość wskazywana przez Ile, natomiast Typ określa jednostkę czasu, który będzie odejmowany. Argument Typ może przyjmować wartości przedstawione w tabeli 15.1.
Jak łatwo się domyślić, funkcja DATE_SUB jest właśnie niezbędna do pierwszego warunku. Będzie on miał w związku z tym postać:
Data > DATE_$UB(NOWO. INTERVAL ttimeout MINUTĘ)
Całe zapytanie będzie natomiast wyglądało następująco:
SELECT C0UNT(*) FROM STATS WHERE Data > DATĘ SUBINOWO. INTERVAL Stimeout MINUTĘ) AND Userld o 0