Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] licznik odwiedzin - dobrze napisany?
Forum PHP.pl > Forum > Przedszkole
dwwa
napisałem prosty licznik odwiedzin oparty o bazę danych mysql, ale nie wiem czy to optymalne rozwiązanie i dobrze napisane... chodzi mi o licznik unikalnych odwiedzin. Na razie sprawdzam tylko ip, ale zaraz dopiszę jeszcze sprawdzanie ciastka.
  1. // counter
  2. function counter() {
  3. $ip = $_SERVER['REMOTE_ADDR'];
  4. $check_ip_query = mysql_query("SELECT `ip` FROM `counter` WHERE `ip` = '$ip'");
  5. if (mysql_num_rows($check_ip_query) == 0) {
  6. mysql_query("INSERT INTO `counter` VALUES (null, '$ip')");
  7. }
  8. $counter = mysql_num_rows(mysql_query("SELECT `id` FROM `counter`"));
  9. return $counter;
  10. }

dobrze to jest napisane? działać działa
nospor
Do sprawdzania liczby rekordów służy COUNT w mysql a nie pobieranie wszystkiego do php i dopiero tam liczenie ile się pobrało - strasznie nieoptymalne.
dwwa
ale chodzi mi o samo rozwiązanie tego licznika, że oparty on jest o bazę

robię statystyki dla strony, dopisałem ilość unikalnych wizyt dziennie, tygodniowo i miesięcznie, co o tym sądzicie?
  1. function counter($value) {
  2.  
  3. switch($value) {
  4. case 'all':
  5. $counter = mysql_num_rows(mysql_query("SELECT `id` FROM `counter`"));
  6. break;
  7. case 'day':
  8. $day = date('Y-m-d H:i:s', time()-1440*60); // 24 hours
  9. $counter = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `date` > '$day'"));
  10. break;
  11. case 'week':
  12. $week = date('Y-m-d H:i:s', time()-10080*60); // 7 days
  13. $counter = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `date` > '$week'"));
  14. break;
  15. case 'mounth':
  16. $mounth = date('Y-m-d H:i:s', time()-43200*60); // 1 mounth
  17. $counter = mysql_num_rows(mysql_query("SELECT * FROM `counter` WHERE `date` > '$mounth'"));
  18. break;
  19. }
  20.  
  21. $ip = $_SERVER['REMOTE_ADDR'];
  22. $date = date('Y-m-d H:i:s', time());
  23. $check_ip_query = mysql_query("SELECT `ip` FROM `counter` WHERE `ip` = '$ip'");
  24. if (mysql_num_rows($check_ip_query) == 0) {
  25. mysql_query("INSERT INTO `counter` VALUES (null, '$ip', '$date')");
  26. }
  27. return $counter;
  28. }

wyświetlam tak:
  1. echo counter('value');
nospor
Kurcze, pytasz się o ty czy jest to optymalne rozwiązanie i czy jest dobrze napisane, to ci odpowiadam że nie jest. Na co ty, że nie takiej odpowiedzi oczekujesz :/

No to dobrze: jest to super napisane, w życiu nie widziałem nic lepszego, chętnie odkupię od ciebie ten skrypt za 2 tys euro.
dwwa
ok, poprawiłem na COUNT. Teraz będzie dobrze?
  1. function counter($value) {
  2.  
  3. switch($value) {
  4. case 'all':
  5. $counter = mysql_query("SELECT COUNT(`id`) FROM `counter`");
  6. break;
  7. case 'day':
  8. $day = date('Y-m-d H:i:s', time()-1440*60); // 24 hours
  9. $counter = mysql_query("SELECT COUNT(`id`) FROM `counter` WHERE `date` > '$day'");
  10. break;
  11. case 'week':
  12. $week = date('Y-m-d H:i:s', time()-10080*60); // 7 days
  13. $counter = mysql_query("SELECT COUNT(`id`) FROM `counter` WHERE `date` > '$week'");
  14. break;
  15. case 'mounth':
  16. $mounth = date('Y-m-d H:i:s', time()-43200*60); // 1 mounth
  17. $counter = mysql_query("SELECT COUNT(`id`) FROM `counter` WHERE `date` > '$mounth'");
  18. break;
  19. }
  20.  
  21. $ip = $_SERVER['REMOTE_ADDR'];
  22. $date = date('Y-m-d H:i:s', time());
  23. $check_ip_query = mysql_query("SELECT `ip` FROM `counter` WHERE `ip` = '$ip'");
  24.  
  25. if (mysql_num_rows($check_ip_query) == 0) {
  26. mysql_query("INSERT INTO `counter` VALUES (null, '$ip', '$date')");
  27. }
  28.  
  29. $counter = mysql_fetch_row($counter);
  30. $counter = $counter[0];
  31. return $counter;
  32.  
  33. }
nospor
Najpierw zliczasz, potem dodajesz. Wynik będziesz miał o jeden nieaktualny.

Jak ktoś już się pojawił miesiąc temu, to nawet jeśli dzisiaj wszedł, to już jako dzisiaj nie zostanie zliczony - no chyba, że jest to celowe.A, to jest celowe, bo to nie jest licznik online, a licznik odwiedzin smile.gif
dwwa
czyli mam wszystko w miarę dobrze teraz?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.