Click counter when link is clicked PHP/JS

9.7k Views Asked by At

I have a little script here that counts clicks when link is clicked and stores it in .txt file, but it works fine when I have only "click=yes" under href. But I can't make it to track clicks when I have link to external site.

Here is my code:

<?php
if(!file_exists('counter.txt')){
file_put_contents('counter.txt', '0');
}
if($_GET['click'] == 'yes'){
file_put_contents('counter.txt', ((int) file_get_contents('counter.txt')) + 1);
header('Location: ' . $_SERVER['SCRIPT_NAME']);
die;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>counter example</title>
</head>
<body>
<h1><?php echo file_get_contents('counter.txt'); ?></h1>
<a href="http://www.google.com?click=yes" target="new">clickMe</a>
</body>
</html>

My guess is it has to do something with header('Location: ' . $_SERVER['SCRIPT_NAME']); but I can't figure it out so I could really use some help.

And is it somehow possible to have multiple links save to the same file, and when I show it on website it's sorted from largest number to smallest? I have an idea how to do it with MySQL database but I can't use it at place where this will be implemented.

Thanks in advance! Cheers!

3

There are 3 best solutions below

5
Paul S. On BEST ANSWER

Your server never sees the URI being accessed as the client leaves your page. To do something like this, it may be best to set up a redirect which works like this

<a href="/goto.php?href=http://www.google.com" target="_blank">click me</a>

(Make sure the external site's URL is URL encoded as you're passing it as a GET component of a URL to your own page)

Then in goto.php you store your click and send a redirect header

if(!file_exists('counter.txt')){
    file_put_contents('counter.txt', '0');
}
file_put_contents('counter.txt', ((int) file_get_contents('counter.txt')) + 1);
header('Location: ' . $_GET['href']);

Now you can track these clicks, you can add your domain-specific counters in goto.php instead of your text file

0
BojanT On

You could use Javascript to catch click on a link , send data via AJAX call. Here is small sample using JQuery.

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <script>
            $(
                    function() {
                        $('a').click(linkClicked);
                    }
            );
            //this funciton will be called on every click on any link on page
            function linkClicked() {
                var url = $(this).attr('href');
                //call PHP script to save URL ./saveurlclicks.php?url=CLICKEDURL
                $.get('./saveurlclicks.php', {'url': url})
                //be sure to return true so user can navigate further
                return true;
            }
        </script>
    </head>
    <body>
        <a href='/some href' >asasa</a>

        <a href="www.google.com" >google</a>
    </body>
</html>

<?php
//saveurlclicks.php
// here we save links in file but using serialized array
// if you need to get count of links clicked , 
// have a second script that unserializes array and sort it in revers order 
$url = @$_GET['url'];
$counterFile = 'counter.ser';
if ($url) {
    if(file_exist($filename))
    $links = unserialize(file_get_contents($filename));
    else $links=array();

    if (!isset($links[$url])) {
        $links[$url] = 0;
    }
    $links[$url] ++;
    file_put_contents($counterFile, serialize($links));
}
0
MadsRH On

I love the simple solution by Paul S., but if you want to track the clicks with date, you can do something like this:

03/03/2022 14
04/03/2022 2

    <?php
$dateexists = false;

if(!file_exists('counter.txt'))
    { $fh = fopen('counter.txt', 'w');
      fclose($fh); }

$datecounts = file('counter.txt', FILE_IGNORE_NEW_LINES);
foreach($datecounts as $key => $datecount){

list($date, $count) = explode("\t", $datecount);

$count = (int) $count;
if($date == date('d/m/Y'))
{   $datecounts[$key] = $date."\t".++$count;
    $dateexists = true; }
}
if(!$dateexists)
    { $datecounts[] = date('d/m/Y')."\t1"; }

$fh = fopen('counter.txt', 'w');
if (flock($fh, LOCK_EX)) {
    foreach($datecounts as $datecount)
    { fwrite($fh, $datecount.PHP_EOL); }
flock($fh, LOCK_UN);
}

else
{ //couldn't lock, might want to do stuff here }

fclose($fh);
header('Location: ' . $_GET['href']); // the redirect
?>