PHP FAQ

Jak zrobić licznik odwiedzin odporny na przeładowania strony

Vogel

Tak:

  $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.

#########################

Pozwolilem sobie troszkę modyfikować licznik Kolegi.

wprowadziłem małe poprawki rzeczy które u mnie nie działały :)

KOD SQL:
#
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

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

4 komentarzy

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ć!

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.

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.