Счетчик кликов при нажатии на ссылку 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
?>