Подсчет уникальных кликов по ссылке

241
19 марта 2017, 06:39

Здравствуйте!

Реализую подсчет уникальных кликов по ссылке.

Вид ссылки:

http://test.loc/product/3/ticket=4thd45fsvnfg7

PHP:

if(isset($_GET['ticket'])){
   $ticket = mysqli_escape_string($connection, strip_tags(htmlspecialchars(trim($_GET['ticket']))));
   if(!isset($_SESSION['ticket'])){
      count_ticket();
   }      
   $_SESSION['ticket'] = $ticket;
} 

Функция count_ticket:

function count_ticket(){
  global $connection;
  $query = "SELECT `count` FROM `ds_customers_ticket` WHERE `ticket` = '{$_SESSION['ticket']}'";
  $res = mysqli_query($connection, $query)  or die(mysqli_error());  
  if(mysqli_num_rows($res) > 0){
    $query = ("UPDATE `ds_customers_ticket` SET `count` = `count` + 1 WHERE `ticket` = '{$_SESSION['ticket']}'");
    $res = mysqli_query($connection, $query) or die(mysqli_error());
  }
}

Если существует $_GET['ticket'] создается сессия, но перед ее созданием я вызываю функцию count_ticket(). По умолчанию в базе данных значение количества переходов по ссылке = 0.

Необходимо подсчитывать уникальные переходы, т.е., если сессия существует уже, засчитывать переход по ссылке не нужно (это в случае, если пользователь будет нажимать F5). У меня, к сожалению, не засчитывает кол-во перехода, если пользователь открыл страницу первый раз и последующие его обновления страницы. Помогите, пожалуйста.

С условием:

if(isset($_SESSION['ticket'])){
      count_ticket();
} 

Отлично все считает, но засчитывает каждое обновление страницы.

Answer 1

а) использовать distinct при выборке из БД

б) делать выборку по тикету и анализировать последнее время записи (или просто игнорировать при наличии в БД такого тикета)

Answer 2

Вот, что нужно было поправить:

if(!isset($_SESSION['ticket'])){
   count_ticket($ticket);
}elseif($_SESSION['ticket'] != $ticket){
   count_ticket($ticket);
}

И соответственно принимать $ticket в функции function count_ticket($ticket){...}

elseif необходим на случай, если этот же пользователь перейдет по ссылке уже с другим тикетом. Если убрать условие, то сессия уже существует у этого пользователя и клик по новому тикету у этого же пользователя не засчитается!

Пользуйтесь на здоровье:)

READ ALSO
DateDiff sql Activerecord

DateDiff sql Activerecord

Нужно выводить запись, только после того как прошло 20 минут, есть такой код, но он не работаетдата хранится в int в unixtimestamp

288
long polling php

long polling php

Добрый вечерГуглил очень много по этому вопросу, но так и не нашел ответа

261
Создание массива классов C++. Как реализовать? [требует правки]

Создание массива классов C++. Как реализовать? [требует правки]

Допустим есть у меня классы Text, Entry, Label, как мне создать массив экземпляров, данных(имеется ввиду этих) классовВообще такое реально

419
Как изменить размер шрифта в NOTIFYICONDATA.szInfo?

Как изменить размер шрифта в NOTIFYICONDATA.szInfo?

Заметил, что у Скайпа например, отличается всплывающее меню в области уведомлений от других приложений в трее - и шрифт, и даже разметкаМне...

298