Счетчик скачивания файлов

Счетчик скачивания файлов

От автора: при создании сайтов очень часто необходимо выкладывать на его страницах материалы для скачивания. При этом полезно знать, какой популярностью пользуется тот или иной файл, а для этого необходимо вести учет количества его скачиваний. Поэтому в данном уроке мы с Вами рассмотрим два варианта создания счетчика скачивания файлов.

скачать исходникискачать урок

Постановка задачи

Итак, в данном уроке нам с Вами необходимо реализовать счетчик скачивания файлов на страницах сайта. Значит, первым делом необходимо определиться, где мы будем хранить результат подсчета скачивания того или иного файла. На мой взгляд, наилучшим решением – является база данных. Поэтому создадим базу данных dc, в которой далее по ходу урока создадим две таблицы – по одной для каждого варианта реализации счетчика загрузок.

Вариант №1

Итак, для первого варианта создаем таблицу count1 в базе данных dc, с двумя полями:

name – поле для хранения имени файла (тип данных String). Важное замечание: имена файлов – должны быть уникальными, а значит нельзя допускать повторений в данном столбце. Поэтому данному полю необходимо присвоить индекс UNIQUE (если одному из полей таблицы присвоен данный индекс, значит в данном поле могут содержаться только уникальные данные, то есть вставка повторяющегося значения приведет к ошибке).

count – количество скачивания файла (тип данных Integer). Значение данного поля по умолчанию – 1.

SQL – запрос для создания таблицы в базе данных.

Теперь давайте определимся с логикой работы скрипта. Изначально, в базе данных нет ни одной записи. Файлы для скачивания, сохранены в отдельной папке на нашем сайте (в моем случае – это папка files), и выводятся на его страницах в соответствии с его задачами и дизайном.

Для данного урока я создал страницу, которая выводит имена всех файлов, в виде ссылок расположенных в папке files. Важно — путь каждой ссылки – не должен вести непосредственно на файл. Потому как нам, необходимо вести учет скачивания. Значит каждая ссылка, должна перенаправлять пользователя на скрипт обработчик, то есть файл, который подсчитает количество скачивания определенного файла и отдаст его пользователю на скачивание. При этом имя файла, для скачивания, будем передавать, используя метод GET, то есть через адресную строку. Итак, первым делом создадим файл конфигурации d_conf.php:

В данном файле создадим константы с настройками для подключения к базе данных (HOST, USER, PASS, DB), так же добавим константу DIR – путь к файлам для скачивания. А также массив $types – типы фалов, допустимые для загрузки.

Далее создадим файл d_func.php, в котором будут описаны функции, необходимые для работы приложения в целом. Создадим первую функцию connect(), которая будет выполнять подключение к базе данных, используя расширение php – mysqli (улучшенный движок по работе с СУБД MySql). Поэтому данная функция будет возвращать идентификатор открытого соединения, который нам потребуется для дальнейшей работы. Код функции connect():

Теперь, так как мы условились, что в таблицу count1, будет записана информация о скачиваемых файлах (имя и количество скачиваний), значит опишем следующую функцию get_count(), которая получит всю информацию из данной таблицы. И как результат вернет массив, в каждой ячейке которого будет содержаться имя файла (ключ ячейки) и количество его скачиваний (значение ячейки):

Файл, который выводит список файлов из папки files, в виде ссылок, выглядит следующим образом:

Как Вы видите, его код довольно простой. Вначале подключаем файл конфигурации и функций. Затем выполняем подключение к базе данных (функция connect()), далее в переменную $row сохраняем информацию о ранее скачиваемых файлах (функция get_count()), если конечно такие имеются. Далее обходим в цикле каждый элемент папки files, и если это файл – выводим его на экран в виде ссылки. Путь ссылки формируем следующим образом – вначале указываем имя файла обработчика (файл который будет выполнять подсчет скачивания), в нашем случае это файл download.php и используя метод GET (через адресную), передаем имя файла для скачивания.

Так как мы знаем, что ключи массива $row — это имена ранее скачиваемых файлов (мы с Вами условились, что в базу данных информация попадет после первого скачивания), поэтому, как только один из ключей данного массива совпадет с именем файла, при обходе папки files. Значит необходимо вывести на экран количество его скачивания пользователями. В этом случае, на экране мы увидим следующее:

Теперь создадим файл downlad.php и добавим следующий код:

В данном файле необходимо проверить, существует ли в суперглобальном массиве $_GET, ячейка file, то есть имя файла для скачивания. Если такая ячейка существует, значит, вызываем функцию update_file($file,$types), передавая ей имя файла и массив допустимых типов файлов для скачивания.

Теперь давайте откроем файл d_funct.php и опишем функцию update_file(),которая должна подсчитать количество скачивания файла и отдать его пользователю для загрузки:

Итак, первым делом, проверяем, тип файла, то есть, определяем его расширение (используя функцию substr()), и используя функцию in_array, проверяем, есть ли в массиве допустимых типов ячейка с найденным расширением. Затем проверяем, существует ли в папке files запрашиваемый файл (данную проверку нужно выполнять, так как пользователь может вручную обратиться к файлу download.php и передать ему произвольный файл).

Далее выполняем соединение с базой данных и формируем SQL запрос для подсчета количества скачивания файла. Обратите внимание, какой мы используем запрос:

Первая часть SQL запроса (INTO count1 (name, count) VALUES(‘$file’, ‘1’)) вставляет новые данные в таблицу count, а именно имя файла и количество скачивания 1 (данная часть работает для первого скачивания фала). Вторая часть (ON DUPLICATE KEY UPDATE count=(count+1)), срабатывает после дублирования данных в поле с индексом UNIQUE, то есть если в поле name при вставке данных будет дублироваться запись, будет выполнено обновление данных. А именно, имя файла остается прежним, обновляется только поле count – его текущее значение в таблице увеличиваем на единицу. Далее выполняем SQL запрос и если не было ошибок, отдаем файл пользователю на скачивание.

Теперь можно проверить работоспособность скрипта.

Вариант 2

Для второго варианта нам также потребуется таблица в базе данных. Поэтому создадим таблицу count2:

name – поле для хранения имени файла (тип данных String). Опять же данному полю необходимо присвоить индекс UNIQUE, так как имена файлов, должны быть уникальными;

id – идентификатор таблицы (тип данных Integer), а значит и идентификатор каждого добавленного файла (атрибут AUTO INCREMENT индекс PRIMARY KEY).

count – количество скачивания файла (тип данных Integer). Значение данного поля по умолчанию – 1.

SQL запрос для создания данной таблицы:

По логике работы данного скрипта, перед тем как вывести доступные файлы для скачивания, необходимо занести информацию о них в базу данных. Таким образом, каждому файлу будет присвоен собственный уникальный идентификатор, который будет использоваться для указания того, какой именно файл пользователь скачивает.

Как обычно нам необходим файл конфигурации, который мы используем из предыдущего варианта данного скрипта. Так же создадим файл d_func.php, в котором будут описаны функции необходимые для работы скрипта. В файле d_func.php создадим две функции:

Первая функция connect() – взята из первого варианта скрипта. Интерес представляет вторая функция insert_file(), которая добавляет новый файл в базу данных. Аргументы, которые принимает функция: $db – дескриптор подключения к базе данных, $file – имя файла, $types – массив допустимых для скачивания файлов.

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

Затем формируем SQL запрос, по вставке данных в таблицу, при этом указываем ключевое слово IGNORE – то есть, отключаем формирование ошибок при вставке имени уже существующего файла. При этом вставка данных не произойдет. Далее выполняем запрос, и если не возникло ошибок, возвращаем истину.

Для получения информации о сохраненных файлах в базе данных, создадим функцию get_count(), логика ее работы аналогична первому варианту скрипта:

Теперь давайте создадим файл admin.php, с помощью которого можно добавить новый файл в базу данных и просмотреть уже существующие:

Как обычно вначале подключаем требуемые файлы и выполняем подключение к базе данных. Затем так как мы добавляем новый файл, используя обычную форму, значит как только придут данные методом POST – вызовем функцию insert_file(), то есть добавим новый файл в базу данных. Далее выполняем перенаправление, на эту же страницу, для очистки данных в суперглобальном массиве $_POST, и вызываем функцию get_count(), что бы просмотреть, какие файлы уже добавлены в базу данных и сколько раз их скачивали. Далее выводим файлы на экран в нужном формате, единственное, я добавил проверку наличия файла при его выводе на экран. Это нужно для того что бы, файлы которые действительно присутствуют в папке files – отображать зеленным цветом, в противном случае – красным.

Вот, что мы увидим на экране браузера, после добавления нескольких файлах.

Теперь давайте создадим страницу, на которой выведем ссылки для скачивания файлов (файл index.php):

Как обычно путь ссылки формируем следующим образом – вначале указываем файл обработчик (который выполнит подсчет количества скачивания), затем передаем, используя GET параметры, идентификатор файла, который пытается скачать пользователь. Теперь создадим файл download.php:

Обратите внимание, логика работы данного файла полностью аналогична первому варианту. За исключением того, что через адресную строку передается идентификатор скачиваемого файла, а не его имя. Так как идентификатор – это число, значит проверим, является ли содержимое ячейки id суперглобального массива $_GET, числом. И если действительно это так – вызываем функцию update_count(). Поэтому в файле d_func.php опишем данную функцию:

Данная функция принимает в качестве параметров переменную $db – дескриптор подключения к базе данных и переменную $id – идентификатор скачиваемого файла. Первым делом необходимо убедиться, что файл с переданным идентификатором действительно существует в базе данных. При этом получим его имя. Далее проверяем наличие файла с определенным именем в папке загрузок – files. И если данный файл действительно существует – обновляем запись в таблице. А именно увеличиваем текущее значение поля count на единицу. Далее, используя функцию header(), отдаем файл пользователю на скачивание.

Давайте посмотрим, что у нас получилось:

Как Вы видите, все успешно работает. На этом данный урок завершен. Всего Вам доброго и удачного кодирования!!!

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии (12)