Jump to content

Cookie Code


NoSalt

Recommended Posts

Hello All

 

    I wrote a tiny piece of cookie code (to set and record cookies and hits) that works pretty well but seems to have a bug in it that I cannot figure out. First, here is the code:

 

<?php
$my_cookie = (isset($_COOKIE['my_cookie'])) ? true : false;

$countFile = "./data/count.txt";
$cookieFile = "./data/cookie.txt";

$dateTime = date('Y-m-d\,H:i:s\,U\,T\,O\G\M\T');
$remoteIPAddress .= $_SERVER['REMOTE_ADDR'];
$remoteUserAgent .= $_SERVER['HTTP_USER_AGENT'];

$cookieVal = $dateTime;
$cookieVal .= ",";
$cookieVal .= $remoteIPAddress;
$cookieVal .= ",";
$cookieVal .= $remoteUserAgent;
$cookieVal .= "\r\n";

    if(!$my_cookie){
    	// read the visit counter
    	$countHandle = fopen($countFile, 'r');
    	$visitCount = intval(trim(@fread($countHandle, filesize($countFile))));
    	fclose($countHandle);

    	// incremenet the visit counter
    	$visitCount++;

// write the new visit count and cookie value to their respective files
    	$countHandle = fopen($countFile, 'w');
    	$cookieHandle = fopen($cookieFile, "a+b");

if(!preg_match('/bot/',$remoteUserAgent)){
    		fwrite($countHandle, $visitCount);
    		fwrite($cookieHandle, $cookieVal);
    	}

    	fclose($countHandle);
    	fclose($cookieHandle);

    	setcookie("my_cookie", $cookieVal, time()+31556926);
    }
    else{
    	// read the visit counter
    	$countHandle = fopen($countFile, 'r');
    	$visitCount = fread($countHandle, filesize($countFile));
    	fclose($countHandle);
    }
?>

 

What is happening is that sometimes, not every time, but, sometimes my cookie.txt count gets a 0 (zero) written back to it and I can't figure out why. Can anybody see anything in there that would have this effect? Like I said, it only gets zeroed out from time to time.

 

Thanks to all for taking the time to read.  :)

Link to comment
Share on other sites

This problem usually occurs when you have concurrent visitors. The file is locked by the operating system for the visitor that got their first and when your code attempts to access the file for the second visitor it cannot read the file (you would be getting errors if your code had error checking logic in it. This results in the $visitCount being a null, which your code should be incrementing to a one, which gets written back to the file by the code running for the second visitor.

 

You need both some error checking logic in your code to make sure the file operations are occurring without error before blindly writing a wrong value back to the file and you would need to use and test file locking status to insure that the count is not lost.

 

You can avoid this kind of problem by using a database instead of a file.

Link to comment
Share on other sites

PFMaBiSmAd ... thanks for reading and replying. I will look into adding some error checking to the site to correct for this. Although, I am suspicious as the site gets, maybe, one or two visitors a day, and mostly from bots. The reason I don't use a db is because this is a "play" site and I am not sure if I will even keep it after my years registration is up.

 

Thanks again.

Link to comment
Share on other sites

Some browsers request a page twice (though I don't know if this would occur close enough in time to cause the problem) and some URL rewriting will also cause a page to be requested twice, so it could be that the two concurrent requests are actually due to a single visitor.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.