Witajcie, problem mam niby prosty - napisać licznik, który pokaże liczbę osób on-line, odsłon, unikalnych wizyt ogółem, wczoraj i dziś. Całość ma działać w oparciu o IP. Oto kod:
  1. <?php
  2. if (!mysql_connect('127.0.0.1', 'root', 'vertrigo')){ //łaczymy z bazą
  3. die('<h4 class="error">Brak połączenia z bazą, spóbuj później</h4>');
  4.  
  5. }
  6. mysql_select_db('uzytkownicy');
  7. $dzis = time()-(24*3600);
  8. $online = time()-600;
  9. $ip = $_SERVER['REMOTE_ADDR'];
  10. $czas = time();
  11.  
  12. $zapyt = "INSERT INTO licznik(ip,data) VALUES('$ip','$czas')"; //dodajemy ip + czas
  13. mysql_query($zapyt);
  14. $zapyt = "UPDATE licznik2 SET odslon=odslon+1"; //powiększamy liczbę odsłon
  15. mysql_query($zapyt);
  16. $zapyt = "SELECT ip FROM licznik WHERE ip='$ip'AND data>'$dzis'";
  17. $rez = mysql_query($zapyt);
  18. $num = mysql_num_rows($rez);
  19. if($num==1){ //licznik unikalnych + kasowanie starych
  20.  $zapyt = "UPDATE licznik2 SET wizyt=wizyt+1"; 
  21.  mysql_query($zapyt); 
  22.  $roznica = time()-(48*3600); //usuwamy dane starsze niż 48 godzin
  23.  $zapyt = "DELETE FROM licznik WHERE data<'$roznica'";
  24.  mysql_query($zapyt);
  25. }
  26.  
  27. //wyswietlamy co trzeba
  28. $zapyt = "SELECT wizyt,odslon FROM licznik2";
  29. $rez = mysql_query($zapyt);
  30. $row = mysql_fetch_array ($rez, MYSQL_ASSOC); 
  31. foreach($row as $linia){
  32. $licznik[] = $linia;
  33. }
  34. $zapyt = "SELECT count(DISTINCT ip)
  35.  FROM licznik WHERE data>$dzis";
  36. $rez = mysql_query($zapyt);
  37. $row = mysql_fetch_array ($rez, MYSQL_ASSOC); 
  38. $licznik[2] = $row['count(DISTINCT ip)'];
  39. $zapyt = "SELECT count(DISTINCT ip)
  40.  FROM licznik WHERE data<$dzis";
  41. $rez = mysql_query($zapyt);
  42. $row = mysql_fetch_array ($rez, MYSQL_ASSOC); 
  43. $licznik[3] = $row['count(DISTINCT ip)'];
  44. $zapyt = "SELECT count(DISTINCT ip)
  45.  FROM licznik WHERE data>$online";
  46. $rez = mysql_query($zapyt);
  47. $row = mysql_fetch_array ($rez, MYSQL_ASSOC); 
  48. $licznik[4] = $row['count(DISTINCT ip)'];
  49.  
  50. echo '<p>wizyt: '.$licznik[0].'</p>
  51.  <p>odslon: '.$licznik[1].'</p>
  52.  <p>dzis: '.$licznik[2].'</p>
  53.  <p>wczoraj: '.$licznik[3].'</p>
  54.  <p>online: '.$licznik[4].'</p>
  55. ';
  56. ?>


1. Zrobiłem dwie tabele - jedna zawiera ip+czas, druga liczbę odsłon oraz wizyt - czy lepiej byłoby to upchać w jednej tabeli? A jeśli tak to jak? Jak powinienem ustawić pola? INT(11) dla czasu i VARCHAR(15) dla ip są optymalne czy niezbyt?
2. Zastanawiam się, czy nie można by połączyć tych zapytań (np. UNIONEM), i czy miałoby to znaczący wpływ na wydajność?
3. Czy koncepcja jaką obrałem jest słuszna, czy można by to jakoś usprawnić. Licznik ma chodzić na okrągło, więc zależy mi bardzo na wydajności.