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

282
01 ноября 2017, 04:07

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

На сайте необходимо отслеживать статистику уникальный и не уникальных переходов переходов по ссылке http://site.ru/test.php?id_flow=1:

  • хиты (не уникальные)
  • клики (уникальные)

Создал 2 таблицы c такой структурой:

CREATE TABLE IF NOT EXISTS `ips` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_flow` int(11) NOT NULL,
  `ip` int(11) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_flow` int(11) NOT NULL,
  `date` date NOT NULL,
  `hits` int(11) NOT NULL,
  `clicks` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

И соответственно сам test.php фаил:

    <?php
require_once 'cache/connect.php'; // подключаемся к базе данных
$date = date("Y-m-d");
$ip = sprintf('%u', ip2long($_SERVER["REMOTE_ADDR"]));
$id_flow = $GLOBALS['id_flow'];
 //Запрашиваем статистику за сегодняшнее число для данного потока
        $s_res =("SELECT id FROM `stats` WHERE `date`='$date' AND `id_flow`=".$id_flow."");
       mysql_query($s_res) or die($s_res . '<br />' . mysql_error());
       $s_res = mysql_query($s_res);
        //Если данных нет, то это первый посетитель за сегодня. Чистим вчерашние Ip и создаем запись для сегодняшнего дня
        if(mysql_num_rows($s_res) == 0){
                $xsql=("DELETE FROM `ips` WHERE `id_flow`=". $id_flow);
               mysql_query($xsql) or die($xsql . '<br />' . mysql_error());
                $xsql=("INSERT INTO `stats` (`id_flow`, `date`, `clicks`, `hits`) VALUES ('$id_flow', '$date', '1', '1')");
           mysql_query($xsql) or die($xsql . '<br />' . mysql_error());

                $xsql=("INSERT INTO `ips` (`id_flow`, `ip`) VALUES (". $id_flow .", ". $ip .")");
                mysql_query($xsql) or die($xsql . '<br />' . mysql_error());
        }else{ //Если уже есть ячейка для сегодняшнего дня, обновляем ее
               if(mysql_num_rows($s_res) != 0){
                $s_row = mysql_fetch_assoc($s_res);
                //Если это уникальный клик
                $sip_res =("SELECT `id` FROM `ips` WHERE `ip`=". $ip ." AND `id_flow`=". $id_flow ."");
                mysql_query($sip_res) or die($sip_res . '<br />' . mysql_error());
                if(mysql_num_rows($sip_res) == 0){ 
                        //Прибавляем +1 к уникальным и не уникальным кликам
                        $xsql=("UPDATE `stats` SET `hits`=`hits`+1, `clicks`=`clicks`+1 WHERE `id`=". $s_row['id']);
                       mysql_query($xsql) or die($xsql . '<br />' . mysql_error());
                        //Заносим ip в базу данных
                        $xsql=("INSERT INTO `ips` (`id_flow`, `ip`) VALUES (". $id_flow .",". $ip .")");
                       mysql_query($xsql) or die($xsql . '<br />' . mysql_error());
               } else{//Если это не уникальный клик  
                        //Прибаляем +1 к не уникальным кликам
                        $xsql=("UPDATE `stats` SET `hits`=`hits`+1 WHERE `id`=". $s_row['id']);
                        mysql_query($xsql) or die($xsql . '<br />' . mysql_error());
                }}
        }

?>

Теперь при переходе по ссылке. Скрипт проверяет если ли БД (в таблице stats) запись за сегодня. Если ее нет то создает её и вносит туда 1 клик и 1 хит.

Также чистить в бд таблицу (ips) за вчера и вносит туда текущий ip вида - 3577446698

Но если обновить страницу то: Скрипт проверяет бд и видит что запись за сегодня есть. В данном случае он таблицу ips не затирает. А записывает туда снова данный ip.

И по непонятным мне причинам опять же засчитывает что это уникальный клик и соответственно записывает 1 клик и 1 хит.

Для проверки работоспособности скрипта менял последнее условие

с 
if(mysql_num_rows($sip_res) == 0){ 
на 
if(mysql_num_rows($sip_res) != 0){ 

И теперь скрипт считал как надо для текущего ip. Но если же я заходил с другого ip - скрипт считал мой клик не уникальным. и просто вносил ip в базу и добавлял 1 хит.

Не могу понять где я у меня ошибка?

Answer 1

Зачем столько всего? Достаточно хранить статистику по хитам

CREATE TABLE stat(ip INT/*, `date` DATE*/, cnt INT /*, прочие поля*/, UNIQUE (ip/*, `date`*/));
INSERT INTO stat(ip/*, `date`*/,cnt)
SELECT $ip/*,CURDATE()*/,1
ON DUPLICATE KEY UPDATE
SET cnt=cnt+1;

И соответственно

SELECT COUNT(ip) clicks, SUM(cnt) hits/*, `date`*/
FROM stat
/*GROUP BY `date`*/;
READ ALSO
К общей сумме товара в корзине прибавить значение

К общей сумме товара в корзине прибавить значение

Подскажите как при формировании общей суммы в корзине товара прибавить значение тв поля этого товара файл mscarthandlerclass

305
goBack не работает как надо

goBack не работает как надо

Я хотел сделать редирект на предыдущую страницу, но $this->goBack() в контроллере возвращает на главнуюГуглил, нашел такое решение $this->goBack(Yii::$app->request->referrer)

270
Активный пункт меню php

Активный пункт меню php

Не могу понять как сделать активный пункт меню php

246
Заменить каждое второе двоеточие в mysql

Заменить каждое второе двоеточие в mysql

Подскажите, каким образом заменить в столбце БД MYSQL каждое второе двоеточие?

272