Php счетчик просмотров статьи

Тема в разделе "PHP", создана пользователем nurlan, 10 сен 2013.

Статус темы:
Закрыта.
  1. nurlan

    nurlan

    Регистрация:
    10 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    Добрый день!
    Имеются статьи на блоге. Каждый блог имеет свой id номер.
    Как сделать чтобы по id номер статьи счетчик читал количество просмотров данной статьи?
     
  2. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    сделать скрипт (назовем его counter.php' ) на каком то домене при обращении к нему с блога счетчик считал

    срипт:
    <?
    вставить проверку по IP откуда идет запрос... типа что бы чужаки не накрутили счетчик

    $blogId = (int)$REQUEST_['blogId'];
    $postId = (int)$REQUEST_['postId'];

    тут загрузка массива
    $s[$blogId][$postId]++;
    тут сохранение массива

    ?>

    ну и в блоге вставляете что-то типа
    file_get_contents('http://example.com/counter.php')
     
  3. nurlan

    nurlan

    Регистрация:
    10 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    О что то есть :Smile:
    Был бы очень благодарен, если Вы помогли занести эти данные($s[$blogId][$postId]++:wink: в БД MySQL
     
  4. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    а смысл?
     
  5. nurlan

    nurlan

    Регистрация:
    10 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    Смысл в том что, если я буду сохранять данные в сессию, то время загрузки страницы увеличится в двое или даже больше.
    --- Добавлено, 10 сен 2013 ---
    Вот нашел решение, напишу код полностью, может кто как и я ищет ответ на этот вопрос:
    Код:
    <?php
    ///////////////////////////////////////////
    /// Скрипт статистики просмотров станиц ///
    ///////////////////////////////////////////
    
    /* данные для соединения с MySQL */
    $INFO['sql_host'] = "localhost";
    $INFO['sql_user'] = "user name";
    $INFO['sql_pass'] = "user pass";
    $INFO['sql_database'] = "database name";
    
    /* проверка, есть ли запись в MySQL */
    /* таблице с таким id или ее нет */
    function searchID($id)
    {
    $result = mysql_query ("SELECT * FROM `my_log` WHERE `page_id` LIKE '".$id."'");
    $num_rows = mysql_num_rows($result);
    if ($num_rows>0)
    {
        return True;
    }
    else
    {
        return False;
    }
    }
    
    
    /* Читает запись из MySQL таблицы */
    /* возвращает ассоциированный массив */
    function MySQLRead($id)
    {
    $id = addslashes($id);
    $result = mysql_query ("SELECT * FROM `my_log` WHERE `page_id` LIKE '".$id."'");
    return (array)mysql_fetch_assoc($result);
    }
    
    /* Обновление времени для конкретной записи */
    function UpdateTime($id, $time)
    {
    $id = addslashes($id);
    $time = addslashes($time);
    $result = mysql_query ("UPDATE `my_log` SET `date` = '".$time."' WHERE `page_id` = '".$id."'");
    return $result;
    }
    
    /* Обновление счетчиков для записи с указанным id */
    function UpdateCounders($id, $all, $today)
    {
    $id = addslashes($id);
    //$time = addslashes($time);
    $result = mysql_query ("UPDATE `my_log` SET `all` = '".$all."',`today` = '".$today."' WHERE `page_id` = '".$id."'");
    return $result;
    }
    
    /* Запись всех значений "По умолчанию" */
    function Default_Write($id)
    {
    $id = addslashes($id);
    $result = mysql_query ("INSERT INTO `my_log` ( `page_id` , `all` , `today` , `date` ) VALUES ('".$id."' , 1 , 1 , '".(time()+60*60*24)."');");
    return $result;
    }
    
    $unical_page_id_gid = md5($_SERVER['REQUEST_URI']); // получение md5() хэша из url страницы
    
    $link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass']); // Соединение с MySQL
    mysql_select_db ($INFO['sql_database']); // Выбор базы данных
    
    if (!searchID($unical_page_id_gid)) // существует ли запись с таким id
    {
        Default_Write($unical_page_id_gid); // запись всех значений по умолчанию
            define("Today_and_all_counter", "Просмотров: 1");
    }
    else // если не существует
    {
    $tmp = MySQLRead($unical_page_id_gid); // считаем значения
    $all = $tmp['all'] + 1;
    $today = $tmp['today'] +1;
    if (time()>=$tmp['date']) // если сутки с момента записи прошли
    {
        UpdateTime($unical_page_id_gid, (time()+60*60*24)); // обновим дату
        UpdateCounders($unical_page_id_gid, $all, 1); // обновим счетчики
        define("Today_and_all_counter", "Просмотров: 1");
    }
    else // если еще нет
    {
        /* обновим счетчики */
        UpdateCounders($unical_page_id_gid, $all, $today);
    }
    /* устанавливаем константу с текущими значениями счетчиков */
    define("Today_and_all_counter", "Просмотров:<b> $all</b>");
    }
    
    mysql_close($link); // Разрываем соединение с MySQL
    ?>
     
  6. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    я не говорил о сесии... а с другой стороны - чем это увеличит?
    загрузить файл, сохранить файл
    в базе будет выглядить так - загрузить файл, разобрать его, получить данные, обновить, сохранить файл

    ну и где действий больше?
     
  7. nurlan

    nurlan

    Регистрация:
    10 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    Я вы о каком виде хранения имели ввиду? И о каком файле идет речь? Мы же о данных говорим...
    Не знаю как, но я пробовал сохранять данные в сессии и время загрузки страницы увеличилось в разы.
    Хранить в БД хорошо тем что каждый id номер сохраняет защирфованном виде, а это соотвественно хорошо тем что id номер поста не будет повторятся.
     
  8. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    бред пишите
    ваши проблемы с фалом сесий - проверка настроек решит это
    ваабщето имелось ввиду простая запись и чтения файла, не вижу смысла хранить такую мелочь в базе
    нужно шифрование используйте шифрование
    а вот о каком защищеном виде речь едет - не понятно
    Id статьи у разных блогов могут повторятся
     
  9. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    889
    Во во вов)
    зашем так жизнь усложнять такими скриптами)
    добавляем в БД в таблицу с постами столбик
    PHP:
    ALTER TABLE table ADD count int(11NOT NULL DEFAULT 0;
    потом в скрипте(шаблоне) просмотра поста добавляем такой вот запрос
    PHP:
    UPDATE table SET count = (count 1WHERE post_id ЧЕМУ ТО ТАМ РАВНО
    тоесть переменная с ID шкой поста

    вот и вся считалка
     
    nurlan нравится это.
  10. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    речь шла о простоте потом речь пошла о быстродействии... для такой мелочи использовать работу с базой...
    а можно еще если уж так надо, установить счетчик яндекса и настроить графики
     
  11. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    889
    а пример что выше я привел не простой и не обладает быстродействием? :biggrin:

    1 столбик с добавлен к таблице к которой и так делается запрос выборки.
    а апдейт одной колонки в БД незаметен даже если считать время выполнения приложения.
    к тому же столбик является с типом целых чисел, ето сказка.
     
  12. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    что быстрей работа с файлом или с базой? и ответишь на свой вопрос
     
  13. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    889
    в том варианте что ты предложил то явно с БД быстрее
     
  14. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    0
    Симпатии:
    0
    обоснуй, а если нет обоснования - то не утверждай, что твоя глупость есть правда
     
  15. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    889
    ты сначала обоснуй работу своего скрипта а не вставляем тут то там то...

    говорю еще раз, выборка из БД и так уже происходит!!! и взять лишних пару символов не затратит ресурсов и не замедлит запрос

    в твоем случае будет отдельно обращаться к отдельному файлу, чем больше обращений к файлам(много файлов раскиданых) тем меньшая производительность.

    или ты даже не можешь обосновать принцип действия своего кода?
     
  16. nurlan

    nurlan

    Регистрация:
    10 сен 2013
    Сообщения:
    1
    Симпатии:
    0
    Шифрование не для защиты используется, а для того чтобы id поста не повторялись и не сбивался счетчик.
    Да бывает такое что id поста одинаковые, а счетчик должен быть для каждого свой.
    --- Добавлено, 10 сен 2013 ---
    Попробуй и твой вариант.
    --- Добавлено, 10 сен 2013 ---
    Не могли бы Вы полностью написать код или примерчик привести, а то я с вашего кода толком не че и не понял.
    --- Добавлено, 10 сен 2013 ---
    Ребята большое Вам спасибо за ответы и за советы!:playfull:
    Воспользовался советом nix, создал поле и сделал к ниму запрос.
     
    Последнее редактирование: 10 сен 2013
  17. Huh

    Huh Guest

    даже не поленюсь полностью написать пусть ТС порадуется
    Код:
    <?php
      $ip=$_SERVER['REMOTE_ADDR'];
    if(!in_array($ip, array('192.168.0.1','192.168.0.2'))) die();
      $filename = 'counter.dat';
      $blogId = (int)$_REQUEST['blogId'];
      $postId = (int)$_REQUEST['postId'];
      if (file_exists($filename)) include($filename);
      else {
      $counter[$blogId][$postId] = 0;
      }
      $counter[$blogId][$postId]++;
      file_put_contents($filename, '<? $counter = '.var_export($counter, TRUE));
    ?>
     
    Lasted edited by : 10 сен 2013
Статус темы:
Закрыта.