Счетчик скачиваний файла на PHP & MySQL

PHP счетчик скачиваний файлаВ этой статье мы узнаем, как написать счетчик скачивания файла самому. Мы напишем простой, в то же время красивый и удобный счетчик на PHP и MySQL. Для красоты будем использовать jQuery. Но базовый скрипт счетчика скачиваний файла написан на PHP, с использованием БД MySQL. Каждый файл будет иметь отдельную строку записи в БД, где будет храниться общее количество скачиваний файла. PHP скрипт, будет обновлять данные в MySQL, и перенаправлять пользователей на соответственный файл. Для подсчета количества скачивания файла, вам необходимо загрузить файл в специальную папку, и использовать специальный URL для доступа к нему.

ШАГ 1 – XHTML

Первым шагом будет создать XHTML разметку списка файлов со счетчиками. Здесь все просто – у нас есть файл менеджер (div), который содержит неупорядоченный лист (ul), в котором каждый файл это li элемент.

Файлы, количество скачек которых необходимо посчитать, мы поместим в папку files, которая находится в корневом каталоге скрипта. PHP проходит через папку и каждый файл разделяет в отдельный li элемент списка (ul).

demo.php

<div id="file-manager">

        <ul class="manager">

                <!-- The LI items are generated by php -->
                <li><a href="download.php?file=photoShoot-1.0.zip">photoShoot-1.0.zip
                        <span class="download-count" title="Times Downloaded">0</span> <span class="download-label">download</span></a>
                </li>
        </ul>

</div>

Заметьте, что href атрибут ссылки – передает имя файла как параметр к файлу download.php. Здесь мы и будем считать количество скачек файла. Скоро вы это увидите.

Не ограничивайтесь этим интерфейсом при создании трекера файлов . Дизайн может быть любой, вам главное передать параметр к файлу download.php. Вы можете просто создать ссылку, с таким же href атрибутом, и все количество загрузок будет сохраняться в БД так же само.

Интерфейс счетчика скачиваний файла

ШАГ 2 – CSS

Что бы на скрипт счетчика было приятно смотреть, добавим немного CSS. Конечно же вы можете менять все на свой вкус.

styles.css

#file-manager{
        background-color:#EEE;
        border:1px solid #DDD;
        margin:50px auto;
        padding:10px;
        width:400px;
}

ul.manager li{
        background:url("img/bg_gradient.gif") repeat-x center bottom #F5F5F5;
        border:1px solid #DDD;
        border-top-color:#FFF;

        list-style:none;
        position:relative;
}

ul.manager li a{
        display:block;
        padding:8px;
}

ul.manager li a:hover .download-label{
        /* When a list is hovered over, show the download green text inside it: */
        display:block;
}

span.download-label{
        background-color:#64B126;
        border:1px solid #4E9416;
        color:white;
        display:none;
        font-size:10px;
        padding:2px 4px;
        position:absolute;
        right:8px;
        text-decoration:none;
        text-shadow:0 0 1px #315D0D;
        top:6px;

        /* CSS3 Rounded Corners */

        -moz-border-radius:3px;
        -webkit-border-radius:3px;
        border-radius:3px;
}

span.download-count{
        color:#999;
        font-size:10px;
        padding:3px 5px;
        position:absolute;
        text-decoration:none;
}

Интересная часть кода, это зеленый лейбл, который по умолчанию display:none. Он показывается с помощью display:block, когда мы наведем на родительский <a>, элемент. Этот элемент показывается без использования JavaScript. Немножко использован CSS3 код, который делает круглые уголки у зеленого лейбла.

Лейбл счетчика скачиваний

ШАГ 3 – PHP

Немного ранее, мы говорили о том, что PHP будет проходить через папку files, и выводить каждый файл как li элементт. Теперь давайте посмотрим как это работает.

demo.php – Верхняя часть кода

// Error reporting:
error_reporting(E_ALL^E_NOTICE);

// Including the DB connection file:
require 'connect.php';

$extension='';
$files_array = array();

/* Opening the thumbnail directory and looping through all the thumbs: */

$dir_handle = @opendir($directory) or die("There is an error with your file directory!");

while ($file = readdir($dir_handle))
{
        /* Skipping the system files: */
        if($file{0}=='.') continue;

        /* end() returns the last element of the array generated by the explode() function: */
        $extension = strtolower(end(explode('.',$file)));

        /* Skipping the php files: */
        if($extension == 'php') continue;

        $files_array[]=$file;
}

/* Sorting the files alphabetically */
sort($files_array,SORT_STRING);

$file_downloads=array();

$result = mysql_query("SELECT * FROM download_manager");

if(mysql_num_rows($result))
while($row=mysql_fetch_assoc($result))
{
        /*  The key of the $file_downloads array will be the name of the file,
                and will contain the number of downloads: */

        $file_downloads[$row['filename']]=$row['downloads'];
}

Заметьте, как мы выбираем все записи из таблицы download_manager, с помощью mysql_query(). После чего, мы добавляем  их в массив $file_downloads, в котором имя файла это ключ, а количество скачек это значение. Далее мы можем получить доступ к числу скачек с помощью строки – $file_downloads['archive.zip'].

Теперь рассмотрим код, который мы будем использовать для генерации li элементов.

demo.php – конец

foreach($files_array as $key=>$val)
{
        echo '<li><a href="download.php?file='.urlencode($val).'">'.$val.'
                <span class="download-count" title="Times Downloaded">'.(int)$file_downloads[$val].'</span> <span class="download-label">download</span></a>
        </li>';
}

Здесь все просто, мы используем цикл foreach для прохождения по массиву $files_array, и выводим его содержимое на экран.

Рассмотрим, как устроен  файл подсчета скачек файлов.

download.php

// Error reporting:
error_reporting(E_ALL^E_NOTICE);

// Including the connection file:
require('connect.php');

if(!$_GET['file']) error('Missing parameter!');
if($_GET['file']{0}=='.') error('Wrong file!');

if(file_exists($directory.'/'.$_GET['file']))
{
        /* If the visitor is not a search engine, count the downoad: */
        if(!is_bot())
        mysql_query("   INSERT INTO download_manager SET filename='".mysql_real_escape_string($_GET['file'])."'
                                        ON DUPLICATE KEY UPDATE downloads=downloads+1");

        header("Location: ".$directory."/".$_GET['file']);
        exit;
}
else error("This file does not exist!");

/* Helper functions: */

function error($str)
{
        die($str);
}

function is_bot()
{
        /* This function will check whether the visitor is a search engine robot */

        $botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
        "looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
        "Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
        "crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
        "msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
        "Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
        "Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
        "Butterfly","Twitturls","Me.dium","Twiceler");

        foreach($botlist as $bot)
        {
                if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
                return true;    // Is a bot
        }

        return false;   // Not a bot
}

В этом коде, мы будем отслеживать поисковых роботов, который также могут сканировать ссылки. В случае посещения ссылки роботом, мы не будем обновлять запись в базе данных. Это нужно для точной статистики, мы будем знать количество скачиваний только реальных посетителей. Для этого нужно включить максимальное количество имен роботов в массив $botlist.

ШАГ 4 – MySQL

В предыдущих шагах, мы говорили, что все данные будут сохраняться в БД, в таблице download_manager. Теперь, посмотрим, с помощью которого запроса мы будем обновлять данные:

INSERT INTO download_manager SET filename='filename.doc'
ON DUPLICATE KEY UPDATE downloads=downloads+1

Этот код заставляет MySQL вставить новую строку в таблицу download_manager, и изменить значение поля filename на имя файла. В случае повтора имени файла мы просто обновим значение поля downloads на +1. Поэтому все новые файлы будут добавляться автоматически в базу данных, если их скачают.

Ниже, предоставлена структура таблицы download_manager:

MySQL структура счетчика скачиваний файла

ШАГ 5 – jQuery

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

Мы сделаем это с помощью маленького кусочка кода jQuery:

$(document).ready(function(){
        /* This code is executed after the DOM has been completely loaded */

        $('ul.manager a').click(function(){

                var countSpan = $('.download-count',this);
                countSpan.text( parseInt(countSpan.text())+1);
        });
});

Мы установили обработчик событий нажатия на ссылку. При каждом нажатии, мы просто добавляем +1 к значению в span теге.

ШАГ 6 – htaccess

Еще одна немаловажная вещь, которую нужно сделать. Так как ссылка на файл, это параметр. Нам нужно прописать несколько строк в htaccess, чтобы происходило перенаправление на скачивание файла. Этот .htaccess файл, должен находиться в папке files:

<Files *.*>
ForceType application/octet-stream
</Files>

На этом, написание счетчика скачивания файлов закончено!

Заключение

Что вы скажете? Как вам такой подход? Если имеете что-то сказать, по поводу счетчика скачивания на PHP & MySQL, можете писать в комментарии. Надеюсь, этот скрипт будет полезен для вас. Еще один момент, не забудьте создать файл connect.php в котором будут настройки подключения к БД, и который будет подключаться к БД.

Дальше: jQuery таймер: создаем таймер обратного отсчета на jquery


Дискуссия по теме     8 Комментариев
Добавить комментарий
Ира 07.10.2015 в 22:36
Подскажите а можно как то это интегрировать в битрикс?
didsico 14.09.2013 в 12:47
Подскажите пожалуйста, где этот скрипт можно скачать одним файлом?
Виталий 15.04.2013 в 23:47
Как сделать file2 чтоб было два "manager" прав и лев.
Тарас 17.04.2013 в 13:25
Не могу понять сути вопроса. Опишите детальнее.
Slava 02.10.2012 в 01:25
Хотелось бы в массив botlist добавить роботов самых популярных в рунете поисковых машин Yandex, Rambler и Mail, но как они правильно называются?
Тарас 02.10.2012 в 14:03
Яндекс - Yandex, Рамблер - StackRambler, Mail.ru использует базу Google, у них нет робота.
Антон 16.08.2012 в 23:24
Здравствуйте! Подскажите как вывести число скачиваний именно одного файла, я пишу в теле страницы:$file_downloads['archive.zip'] но мне выводит все файлы из папки files. И еще число скачиваний обновляется только после перезагрузки страницы даже с jQuery. Куда вставлять код этого скрипта? Может я что-то не так делаю. Ответьте пожалуйста, всю голову сломал!
Тарас 21.08.2012 в 13:41
Вроде все так делаете... Все имена файлов и количества их скачиваний содержатся в массиве file_downloads, где ключ - имя файла, значение - количество скачиваний. Можете дать ссылку на пример? Может-быть проблема в другой части кода...
Добавить комментарий
Просмотров: 11750
Страхование КАСКО
карта банка
ндфл
усн
Оформление доверенности
страхование ипотеки
esim
осаго
ВЗР страхование
кредитная карта
Cialis barato Viagra Contrareembolso Cialis 5 mg precio mejores farmacias para comprar Viagra reacciones adversas de Cialis Reduslim cómo tomar soluciones para la impotencia Sildenafil Comprare Cialis 5 mg Giornaliero online in Italia Effetti indesiderati del Cialis 5 mg Acquista Cialis 20mg Cialis originale in vendita In Svizzera si compra il Viagra senza ricetta Cialis 10mg online Acquista Viagra in farmacia Offerta Cialis 5mg Spedra Avanafil in vendita online Acquista Viagra in Svizzera senza prescrizione авиатор спрайб Consegna a domicilio di Cialis 5 mg Effetti collaterali di Cialis 5 mg Consegna a domicilio di Cialis 20mg Acquista Cialis originale generico in Svizzera Consegna a domicilio di Viagra senza ricetta in Svizzera Compra Cialis 10mg Consegna a domicilio di Viagra in farmacia online Sconto Cialis 5mg Comprar Reduslim por internet Comprare Spedra Avanafil senza ricetta online Dove comprare il Viagra in Svizzera Compra Cialis Comprar online Viagra Contrareembolso Dónde encontrar Cialis 5 mg al mejor precio Viagra sin receta Cialis 5 mg efectos secundarios graves Reduslim comprar en línea Disfuncion Erectil tadalafilo avanafil prezzo cialis 20 mg prezzo cialis effetti benefici cialis 10 mg Reduslim Kaufen pulse x coin price