Счетчик скачиваний файла на PHP + mySQL

Author Автор: Роман Чернышов    Опубликовано: 15 февраля 2012

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

Скрипт будет использовать PHP класс для работы с базой данных.

<?php
$folder = '/examples/'; // Папка с файлами
$ext 	= array('rar','zip'); // Устанавливаем разрешенные типы файлов для скачивания
$subfolder = true; // Разрешить скачивание из вложенных папок
 
	$settings = array(
	  'dbName' => '',
	  'dbUser' => '',
	  'dbPass' => '',
	  'dbHost' => 'localhost'
	 ); // Настройки подключения к БД
 
 
// Подключаем класс для работы с БД
include('lib/dbsql.class.php');
 
// Инициализируем подключение к БД
$DB = new DB_Engine('mysql', $settings['dbHost'], $settings['dbUser'], $settings['dbPass'], $settings['dbName']);
 
 
$filename=$_GET['f'];
$f=explode('.',$filename);
if(!in_array($f[count($f)-1], $ext)) die('Данный тип файла запрщен для скачивания');
 
$crc=md5($filename); // Генерируем хеш имени файла
$date=time(); // Текущее время
 
$sql="SELECT * FROM `rche_uploads` WHERE `crc` = '$crc' LIMIT 1";
$exrow=$DB->getAll($sql); // Берем из БД запись с таким хешем
if($_GET['event']=='show')
	{
	 echo "Скачали: {$exrow[0]['count']} раз(а), Последняя дата скачивания: ".date('H:i d.m.Y',$exrow[0]['date']);
	 exit;
	}
if(count($exrow)>0) // Если запись в БД с таким хешем есть увеличиваем счетчик, если нет вносим новую запись в БД
	{
	$count=$exrow[0]['count']+1; //Текущее значение счетчика увеличиваем на 1
	$sql="UPDATE `rche_uploads` SET `count` = '$count' WHERE `crc` = '$crc' LIMIT 1;";
	}
        else
	{
	$sql="INSERT INTO `rche_uploads` (`crc`,`count`,`date`) VALUES ('$crc','1','$date');";
	}
$DB->execute($sql); // Выполняем mySQL запрос
header("Location: {$folder}{$filename}"); // Переход на скачиваемый файл

Структура БД

CREATE TABLE IF NOT EXISTS `rche_uploads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`crc` varchar(50) NOT NULL,
`count` int(11) NOT NULL,
`date` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Пример использования скрипта, для скачивания файла вызываем ссылки вида (переменная «f» содержит путь к файлу который требуется скачать):

http://rche.ru/upload2.php?f=854/upload2.zip

Для просмотра статистики по количеству и времени скачиваний, добавляем в запрос переменную event со значением show

http://rche.ru/upload2.php?f=854/upload2.zip&event=show

Исходники скрипта можно скачать по этой ссылке.

Надеюсь пример моей реализации вам пригодиться или послужит маленьким уроком быстрого создания счетчика скачиваний на PHP.

2 комментария to “Счетчик скачиваний файла на PHP + mySQL”

  • салаи 15.08.2013 в 8:39 дп

    Господи иисусе! Да почему просто не сделать тоже самое только через аякс и вывод количества скачиваний рядом с сылкой!
    Что же у всех так юзабилити хромает… ужас..

    • Роман Чернышов 23.08.2013 в 1:37 дп

      Ну вообще этот пример призван показать принцип работы, а аякс это уже по желанию и усмотрению каждого вебмастера индивидуально. Но опять же если задуматься: представим такую картину, на странице выводится информация о 10 файлах и количество скачиваний каждого — зачем нам делать запросы на аякс для получения информации о скачивании того или иного файла? в чем тут юзабилити? Ведь это дополнительно 10 аякс запросов к серверу…. не проще ли сразу вывести данную информацию сгенерированную PHP кодом рядом с файлом.
      И вообще статья не много не об этом!

Оставить комментарий

Автор блога
Чернышов Роман
Роман Чернышов
Веб-разработчик, Full Stack
Senior, Architector
PHP, JavaScript, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка