Rozdział 15. ♦ Generowanie statystyk 423
♦ vi sitsStats — pobierająca i wyświetlająca dane dotyczące odwiedzających,
♦ pri ntBrowsersStats — pobierająca i wyświetlająca dane dotyczące przeglądarek,
♦ printSystemsStats — pobierająca i wyświetlająca dane dotyczące systemów operacyjnych,
♦ printUsersStats — pobierająca i wyświetlająca dane dotyczące najczęściej logujących się użytkowników,
♦ printIPStats — pobierająca i wyświetlająca dane dotyczące adresów 1P, z których najczęściej przychodziły połączenia,
♦ printLastHitsStats — pobierająca i wyświetlająca dane adresy IP i daty 10 ostatnich odwiedzin.
Każda z wymienionych funkcji (z wyjątkiem visitsStats) wykonuje odpowiednio sformułowane zapytanie SQL. Ponieważ wynikiem każdego zapytania jest tabela o dwóch kolumnach, do wyświetlania tych wyników (w celu skrócenia i uproszczenia kodu) została wyodrębniona dodatkowa funkcja o nazwie printOueryResult. Otrzymuje ona w postaci argumentu identyfikator wyniku zapytania, zwrócony przez funkcję rnysql_ query, oraz pobiera i wyświetla w pętli while wyniki. Oczywiście wyniki są umieszczane w wierszach i komórkach tabeli HTML.
Przyjrzyjmy się bliżej funkcjom generującym wyniki. Zacznijmy od visitsStats. Jej zadaniem jest pobranie liczby odwiedzin na stronie, zarówno całkowitej, jak i z podziałem na załogowanych i niezalogowanych użytkowników. Kod rozpoczyna się od sprawdzenia, czy zmienna connected ma wartość true, czyli czy jest aktywne połączenie z bazą. Jeśli nie, funkcja kończy działanie, gdyż w takiej sytuacji nie mogłaby wykonać żadnego zapytania. Jeśli jednak połączenie jest aktywne (connected = true), zmiennej query jest przypisywane pierwsze zapytanie, którego celem jest pobranie liczby wszystkich odwiedzających. Konstrukcja tego zapytania zależy od stanu parametrów przekazanych funkcji.
I tak, jeśli argumenty dataOd i dataDo nie są pustymi ciągami znaków, zapytanie będzie miało postać:
SELECT COUNTt*) AS Ile FROM Stats
WHERE Data >= 'SdataOd' AND Data <= 'SdataDo'
ORDER BY Ile DESC
W przypadku gdy dataOd i (lub) dataDo zawierałyby puste ciągi znaków, ale argument ile byłby większy od zera (jak pamiętamy, określałby on w takiej sytuacji liczbę dni, z których mają być generowane statystyki), zapytanie miałoby postać:
SELECT COUNTt*) AS Ile FROM Stats
WHERE Data > DATE_SUB(NOW(). INTERYAL Sile DAY)
ORDER BY Ile DESC
Jeśli natomiast dataOd i (lub) dataDo zawierałyby puste ciągi znaków, a parametr i 1 e byłby mniejszy od jeden, zastosowane zostałoby zapytanie:
SELECT COUNTt*) AS Ile FROM Stats ORDER BY Ile DESC