Prosty licznik odwiedzin - PROBLEM - liczy za dużo wejść

0

Witam

Koledzy jest problem...

Mam sobie stronkę i potrzebny mi jest licznik wejść.

Używam ciasteczka do tego. W celach testowych ustawiłem czas ciasteczka na 2 godziny.

Ilość wejść jest odczytywana z bazy, jeśli ciasteczko nie istnieje wtedy zwiększam o 1 i zapisuje do bazy.

Niby proste, ale zwiększenie o 1 powinno odbyć się najwcześniej po 2 godzinach nie odświeżania strony.

Podglądam sobie bazę danych, odświeżając ją co jakiś czas i zauważam, że po odświeżeniu po 10-15 minutach licznik wejść zwiększył się o kilka. Aktywność strony jest zerowa.

Co jest źle w moim kodzie?


<?php

	$nazwa = 'isVisit';
	$wartosc = '1';
	$czaswygasniecia = time() + 60 * 60 * 2; //time() oznacza aktualny czas podany w sekundach, dodajemy do niego 86400 sekund ( 24 godziny ).


	$sql_conn = mysql_connect(dane(1), dane(2), dane(3)) or die(dane(4));
	mysql_select_db(dane(5)) or die (dane(6));
	mysql_query("SET NAMES 'latin2'");

	$l = mysql_fetch_row(mysql_query("SELECT `count` FROM `visit` WHERE `id`='1'"));

	$liczba = $l[0];
	
	if (!isset($_COOKIE['isVisit'])) 
	{
		$liczba++;

		mysql_query("UPDATE `visit` SET `count`='$liczba' WHERE `id`='1'");
	}

		
	setcookie($nazwa, $wartosc, $czaswygasniecia);
	
?>	    

 

<!-- ========================================================================================================
=============================================================================================================
						JAVA SCRIPT
=============================================================================================================
========================================================================================================= -->
	
	<script type="text/javascript">
		jQuery(document).ready(function()
		{

			licznik = <?php echo $liczba; ?>;


			$("#visit").html("[ " + licznik + " ]");

		});
		
	</script>


0

Z jakiego powodu przez php generujesz kod javascript, który wpisuje wartość w element HTML i nic poza tym? o.O Czemu nie od razu przez php w element HTML?

0

To taka moja potrzeba jest :)

Plik, odpowiedzialny za zliczanie wejść i obsługę bazy to osobny plik.

Używam require(plik) aby dołączyć go do kodu w kilku innych plikach. Nie każdy zawsze wejdzie na stronę główną...
W tych innych plikach powtarzalne jest tylko MENU i właśnie do tego pliku dołączam licznik. Samo pokazanie ilości wejść jest wcześniej (wyżej). Muszę zatem poprzez javascript zmienić wartość licznika.

Wiem, że coockies powinny być na początku pliku. Myślisz, że to może być przyczyną naliczania niewejściętych wejść? :):)

Mogę też w każdym pliku dodać kod licznika osobno (około setki plików), ale to cholernie dużo roboty. Jeśli nie będzie wyjścia to będę musiał to zrobić, liczę jednak, że można to jakoś naprawić aby nie doliczał wejśćod tak sobie.... Wszystko przez to, że pomysł na licznik wejść pojawił się dopiero teraz a nie od początku tworzenia strony.

0

Podstrony? A trzymasz je w osobnych folderach, albo używasz mod_rewrite do tworzenia ścieżek typu: /artykuly/10-jakis-tytul/
Bo cookie ma coś takiego jak path: http://www.php.net/setcookie

0

Próbowałem z parametrem PATH i bez niego.

Nie chodzi tu raczej o samo cookie bo to działa jak trzeba.

Chodzi o to, że nawet jak nie odświeżam strony, zamknę przeglądarkę i po jakimś czasie ją włączę to mam nabite kilkadziesiąt wejść. Wiem, że nikt nie wchodzi zewnątrz.
Tak jakby skrypt gdzieś działał w tle... Na localhoscie działa OK, nie nabija do bazy. Po wrzuceniu na serwer licznik idzie w górę... NIe wiem dlaczego....

0

A loguj sobie każde jedno wbicie na stronę czymś takim:

$logfile = 'logs/req_'.date('Y-m-d H_i_s').'.txt';
$str = '-----------
GET: '.print_r($_GET, true);
$str .= '-----------
POST: '.print_r($_POST, true);
$str .= '-----------
SERVER: '.print_r($_SERVER, true);
file_put_contents($logfile, $str);

Samo się nie dzieje na pewno.

0

Dzięki, spróbuje tego....

Spróbuje też włożyć ten licznik do każdego pliku z osobna, zaraz na początku kodu....

Oby to dało jakiś efekt....

0

Witam

Poświęciłem trochę czasu i zmodyfikowałem pliki. Teraz kod od licznika jest na początku każdego pliku i działa tak jak trzeba. Widać musi byc tak jak jest napisane, że cookie musi być ustawiane na początku pliku, przed wywołaniem czegoś innego. Może to właśnie to było problemem - nie wiem tak do końca. Najważniejsze, że teraz licznik działa tak jak trzeba.

Dzięki ogromne za pomoc
To bardzo miłe, że są osoby, które chcą pomóc.

Pozdrawiam serdecznie

0

Witam

Przepraszam najmocniej - ale problem powrócił.
Ja nie wiem co jest grane, ale dziś rano patrzę na licznik a ten nabił mi jakieś 150 wejść.
Komp na całą nockę był wyłączony, żadnego ruchu na stronie nie było, tego jestem pewnien.

Przecież to takie proste, zrobić licznik odwiedzin, a jednak okazuje się, że nie zawsze :(

Mam plik: visit.php


<?php
	require('dane.php');

	$nazwa = 'isVisit';
	$wartosc = '1';
	$czaswygasniecia = time() + 60 * 60 * 200; // DWIESCIE GODZIN

	$sql_conn = mysql_connect(dane(1), dane(2), dane(3)) or die(dane(4));
	mysql_select_db(dane(5)) or die (dane(6));
	mysql_query("SET NAMES 'latin2'");

	$l = mysql_fetch_row(mysql_query("SELECT `count` FROM `visit` WHERE `id`='1'"));
	$liczba = $l[0];
	
	if (!isset($_COOKIE['isVisit'])) 
	{
		$liczba++;
		mysql_query("UPDATE `visit` SET `count`='$liczba' WHERE `id`='1'");
	}
	
	setcookie($nazwa, $wartosc, $czaswygasniecia);
?>	    

Później w każdym pliku (na samym początku pliku), na który użytkownik może wejść mam:

<?php

reguire('../visit.php');

?>

Później, w odpowiednim miejscu wyświetlam zmienną $liczba.

Czy ja coś tutaj robię źle?

Może błędem jest, że zapisuje ilość wejść do bazy a nie do pliku?

Znowu zwracam się o pomoc...

0

A logowanie zrobiłeś? To zrób. I nawet jak Ci się wyda, że problem zażegnany - zostaw logowanie na dwa kolejne tygodnie, dla pewności. Za trudno jest zgadywać co zepsułeś..

Zapis do bazy jest milion razy lepszy niż do pliku (jakbyś robił w pliku to pewnie byś niedługo napisał temat "licznik odwiedzin mi się zeruje").

0

OK, logi są

Jak testuje na localhoscie to jest OK. Dopiero po wrzuceniu na serwer licznik głupieje... Tak jakby ciasteczko się kasowało a stronka się odświeżała co parę minut...

0

A jeszcze jedno...

Teraz mi wpadło do łba - mam wstawiony skrypt z google - Analytics w tych plikach.

Póki co jest on mi potrzebny.

Czy może to być przyczyną tego błędnego liczenia wejść?

0

nie sadze

0

OK, zaobserwowałem taką rzecz:

Logi nie tworzą się, a powinny przy każdym wejściu.
Logów nie ma, a wejścia są...

Co jest grane? W jaki sposób to dopisuje się do bazy?

0

Potrafisz zasymulować wejście po którym nie tworzą się logi?

0

Nie potrafię zrobić takiej symulacji. Skrypt jest prosty, dodaj licznik i stwórz loga. Musiałbym wyrzucić logi aby zasymulować, ale to nie o to chodzi....

A może to być robot google bądź inny?

0

Z logów wynika, że to googlebot i bingbot.

0

No to tada, problem rozwiązany, boty wchodzą Ci na stronę, z racji, że nie przyjmują cookies to każde odwiedzenie podstrony dodaje Ci wejście na stronę.

0

Kurde, z jednej strony dobrze że boty indeksują sobie moją stronkę ale z drugiej fałszują licznik....
Jest jakiś sposób aby przefiltrować wejścia botów i żeby nie fałszowały wejść? :)

0

No tak, boty Ci się przedstawiają przecież (zmienna $_SERVER['HTTP_USER_AGENT']) - sprawdzasz czy to bot i jeżeli tak - to nie zliczasz wejść.
Sposobem na gotowca jest oczywiście how to detect bots php w Google.
A Twój sposób zliczania wejść jest trochę... kiepski, żeby nie rzec - beznadziejny. No ale niech będzie.

0

Tak, najprostszy jaki tylko może być :)
Pokombinuje żeby zrobić mały filtr:)

Dzięki ogromne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1