счетчик числа кликов по ссылкам в php

Мне нужно реализовать счетчик ссылок, который будет подсчитывать количество кликов по ссылке …

Прямо сейчас, что я делаю, я связываю href с redir.php, который увеличит счетчик в БД, а затем с помощью header('Location:'); Я перенаправляю его на правильный URL.

Это работает, но это, безусловно, не самый лучший подход. Чтобы сделать мой код эффективным, как я могу сделать этот счетчик ссылок лучше? AJAX?

Не много опыта с ajax, поэтому мне интересно, как это сделать в ajax или есть ли другой лучший метод …

Я не хочу, чтобы кто-то писал сценарий бота, который бы делал несколько запросов на redir.php и испортил статистику.

Вы можете использовать

  1. Javascript, чтобы сделать вызов Ajax на ваш "counter.php"
  2. Добавьте Javascript-код (например, Google Analytic) на каждую страницу, чтобы опубликовать в базе данных
  3. Создайте «задание cron» для анализа «access_log» (если вы считаете ссылку в том же домене, сервере)
  4. Добавьте PHP-код для обновления базы данных при создании каждой страницы.

Но я думаю, что первый javascript-метод является лучшим.

  1. Добавить класс по ссылке для шпиона
  2. Добавьте «Обработчик событий» для создания сообщения AJAX
  3. Создайте простой PHP-скрипт для обновления базы данных.

Ака

Если ваши ссылки генерируются из источника, такого как CMS, а не вручную, вы можете передать идентификатор ссылки на ваш URL-адрес и загрузку показаний счетчика следующей страницы, на который была нажата ссылка. Для этого вам потребуется перезагрузить (без идентификатора ссылки) страницу после этого шага, чтобы убедиться, что кто-то, копировавший ссылку, не сделает счетчик лишним.

Этот метод является пуленепробиваемым, если у вашего пользователя включен javascript, но если у вашего пользователя включен javascript, вы все равно можете выполнить описанный выше метод и через слой на стороне клиента, обойти все это и отправить его через AJAX.

Это может показаться избыточным, но таким образом вы ускоряете процесс для большинства ваших посетителей (без перенаправления, так как вы делаете это через AJAX), и в случае, если javascript не работает или отключен, у вас есть доказательство сбоя система, которая не позволит пропустить какой-либо щелчок

Исходя из ответа @ Akarun, вот пример кода (в jQuery) для добавления «прослушивателя» к ссылкам на клики со «шпионским» классом. Обратите внимание, что я загружаю изображение вместо попытки $.post или другого события AJAX – это потому, что они не будут завершены к тому моменту, когда человек будет перемещаться в сторону от страницы (в большинстве случаев щелчок по ссылке связан с этим ), в то время как браузер со временем получит запрос на изображение. Это по-прежнему обычный PHP-скрипт, браузер просто думает, что он загружает изображение.

 $(document).ready(function() { $('a.spy').mousedown(function(event) { var page_url = "<?=$_SERVER['PHP_SELF']?>"; var target_url = $(this).attr('href'); if(target_url != "#" && target_url != "javascript:void(0);") new Image().src= "/welcome/track_link/?page_url=" + escape(page_url) + "&target_url=" + escape(target_url); return true; }); }); 

Вы думали о мобильных пользователях и других устройствах? Я считаю, что ваша первая реализация полностью адекватна и безопасна. Вы полностью контролируете подсчет, и нет проблем с манипуляциями с пользователем. Он также работает предсказуемо.

В конце концов, ajax будет просто делать что-то в counter.php; Прочитайте и обновите базу данных. Оставайтесь с вашей нынешней реализацией.

Сделайте это так, как это делает Google:

 <a href="http://www.vacationhomes.com/" onmousedown="return clk(this.href,'','','','2','','0CE4Q0gIoAzAB')">Waterfront Rentals</a> 

Функция javascript. Прошедший код помогает обеспечить безопасность.

Фактически, глядя на источник Google, они загружают изображение с URL как параметр

 window.clk=function(e,b,a,k,i,c,j) { if(document.images) { b=encodeURIComponent||escape;a=new Image;var f=window.google.cri++;window.google.crm[f]=a;a.onerror=a.onload=a.onabort=function() { delete window.google.crm[f] }; var d,g,h;if(google.v6) { d=google.v6.src;g=google.v6.complete||google.v6s?2:1;h=(new Date).getTime()-google.v6t;delete google.v6 }if(c&&c.substring(0,6)!="&sig2=")c="&sig2="+c;a.src=["/url?sa=T&source=",google.sn,"&cd=",b(i),google.j&&google.j.pf?"&sqi=2":"","&ved=",b(j),e?"&url="+b(e.replace(/#.*/, "")).replace(/\+/g,"%2B"):"","&ei=",google.kEI,d?"&v6u="+b(d)+"&v6s="+g+"&v6t="+h:"",c].join("") } return true };