Licznik odwiedzin, odporny na przeładowania strony

Vogel
  $ip = $_SERVER["REMOTE_ADDR"];
  
  $mysql = mysql_connect("host", "user", "password");
  mysql_select_db("database", $mysql);

  // usuwam userów dawnych

  $sql = "DELETE FROM counter WHERE counter_time < ".(time()-36000);
  mysql_query($sql);

  // sprawdzam, czy aktualny nie został usunięty (był na stronie w czasie 10 min)

  $sql = "SELECT counter_time FROM counter WHERE counter_ip = '".$ip."'";
  $result = mysql_query($sql);

  // aktualizacja lub dodanie rekordu

  if (mysql_fetch_row($result)) {
    $sql = "UPDATE counter SET counter_time=".time()." WHERE counter_ip = ".$ip;
    mysql_query($sql);
  } else {
    $sql = "INSERT INTO counter (counter_time, counter_ip) VALUES ('".time()."', '".$ip."')";
    mysql_query($sql);

    // zwiększenie licznika
    
    $sql = "UPDATE site_info SET counter=counter + 1";
    mysql_query($sql);
  }

  // wyświetlenie licznika

  $sql = "SELECT counter FROM site_info";
  $result = mysql_fetch_array(mysql_query($sql));
  $counter = $result["counter"];
  
  mysql_close($mysql);

Zasada jest prosta: zapisuję adresy IP osób, i czas, w którym ostatio weszły na stronę/podstronę. Jeżeli ktoś nie wszedł przez 10 min to jest usuwany z listy, i może być policzony jeszcze raz. Jeżeli wszedł w tym czasie, to aktualizuję czas.

Alternatywna wersja

Pozwolilem sobie troszkę modyfikować licznik Kolegi. Wprowadziłem małe poprawki rzeczy które u mnie nie działały :)

Inicjalizacja bazy danych

CREATE TABLE `counter` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`counter_time` VARCHAR( 25 ) NOT NULL ,
`counter_ip` VARCHAR( 15 ) NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE TABLE `site_info` (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`counter` INT( 15 ) NOT NULL 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

INSERT INTO site_info VALUES ('', '"0"');

Kod licznika

<?
$ip = $_SERVER["REMOTE_ADDR"];
# połączenie z bazą
include('polanczenie.php');
  // usuwam userów dawnych
  $sql = "DELETE FROM counter WHERE counter_time < ".(time()-36000);
  mysql_query($sql);
  // sprawdzam, czy aktualny nie został usunięty (był na stronie w czasie 10 min)
  $sql = "SELECT counter_time FROM counter WHERE counter_ip = '".$ip."'";
  $result = mysql_query($sql);
  // aktualizacja lub dodanie rekordu
  if (mysql_fetch_row($result)) {
    $sql = "UPDATE counter SET counter_time='".time()."' WHERE counter_ip = '".$ip."'";
    mysql_query($sql);
  } else {
    $sql = "INSERT INTO counter (counter_time, counter_ip) VALUES ('".time()."', '".$ip."')";
    mysql_query($sql);
    // zwiększenie licznika
  $sql = "UPDATE `site_info` SET `counter`=`counter` + 1";
    mysql_query($sql);
  }
 // wyświetlenie licznika
  $sql = "SELECT counter FROM site_info";
  $result = mysql_fetch_array(mysql_query($sql));
  $counter = $result["counter"];
 
echo "odwiedzin stron było: $counter";
?>

Licznik odporny na przeładowania strony na 10 minut, po każdym przeładowaniu strony czas jest ponownie liczony od zera na kolejne 10 minut. Czas można ustawić wedlug uznania, ja sobie ustawiłem

<?php
$sql = "DELETE FROM counter WHERE counter_time < " . (time() - 144000); 

4 komentarzy

Sprawdź darmowy skrypt PHP + komponent flash fcounter

http://www.flashstar.pl/f/fcounter/

Mały(2,5KB) odporny na odświerzanie (sesje), ładny(można podstawić swoje grafiki), bez reklam i łatwy w instalacji.

Kod powinien wyglądać tak:

<?php $ip = $_SERVER["REMOTE_ADDR"]; $mysql = mysql_connect("localhost", "foruum_strona", "1356892"); mysql_select_db("foruum_strona", $mysql); // usuwam userów dawnych $sql = "DELETE FROM counter WHERE counter_time < ".(time()-36000); mysql_query($sql); // sprawdzam, czy aktualny nie zosta³ usuniêty (by³ na stronie w czasie 10 min) $sql = "SELECT counter_time FROM counter WHERE counter_ip = '".$ip."'"; $result = mysql_query($sql); // aktualizacja lub dodanie rekordu if (mysql_fetch_row($result)) { $sql = "UPDATE counter SET counter_time=".time()." WHERE counter_ip = ".$ip; mysql_query($sql); } else { $sql = "INSERT INTO counter (counter_time, counter_ip) VALUES ('".time()."', '".$ip."')"; mysql_query($sql); // zwiêkszenie licznika $sql = "UPDATE site_info SET counter=counter + 1"; mysql_query($sql); } // wyœwietlenie licznika $sql = "SELECT counter FROM site_info"; $result = mysql_fetch_array(mysql_query($sql)); $counter = $result["counter"]; mysql_close($mysql); ?>

I z tego co widać to jest oparty na sql więc dopisz jaki zapytania trzeba wykonać!

a jak to samo zrobic na plikach?

hmm.. moim zdaniem należałoby to zrobić jednak na sesjach+ostatni ip, gdyż wtedy mamy pewność - jeżeli strona to np. internetowa biblia :), to jak ktoś sobie będzie chciał poczytać, to posiedzi dłużej niż 10min.