Войти Регистрация

Счетчик скачиваний файла на 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, где ключ - имя файла, значение - количество скачиваний. Можете дать ссылку на пример? Может-быть проблема в другой части кода...
Добавить комментарий
Просмотров: 10147