Счетчик кликов при нажатии на ссылку PHP/JS

У меня есть небольшой скрипт, который подсчитывает количество кликов при нажатии на ссылку и сохраняет его в файле.txt, но он прекрасно работает, когда у меня только "click=yes" в разделе href. Но я не могу отслеживать клики, когда у меня есть ссылка на внешний сайт.

Вот мой код:

<?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>

Я предполагаю, что он должен что-то делать с заголовком ('Location: ' . $_SERVER['SCRIPT_NAME']); но я не могу понять это, поэтому я мог бы действительно использовать некоторую помощь.

И возможно ли сохранить несколько ссылок в одном и том же файле, и когда я показываю их на веб-сайте, они сортируются от наибольшего к наименьшему числу? У меня есть идея, как это сделать с базой данных MySQL, но я не могу использовать ее там, где это будет реализовано.

Заранее спасибо! Ура!

3 ответа

Решение

Ваш сервер никогда не видит доступ к URI, когда клиент покидает вашу страницу. Чтобы сделать что-то вроде этого, может быть лучше настроить перенаправление, которое работает следующим образом

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

(Убедитесь, что URL- адрес внешнего сайта закодирован как URL, когда вы передаете его как компонент GET URL-адреса на свою страницу)

Затем в goto.php Вы сохраняете свой клик и отправляете заголовок перенаправления

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']);

Теперь вы можете отслеживать эти клики, вы можете добавить свои доменные счетчики в goto.php вместо вашего текстового файла

Вы можете использовать Javascript, чтобы поймать клик по ссылке, отправить данные с помощью вызова AJAX. Вот небольшой пример с использованием 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));
}

Мне нравится простое решение Пола С., но если вы хотите отслеживать клики по дате, вы можете сделать что-то вроде этого:

03.03.2022 14
03.04.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
?>
Другие вопросы по тегам