- → Программирование
- → PHP
- → Статьи
Счетчик скачиваний файла на PHP & MySQL
В этой статье мы узнаем, как написать счетчик скачивания файла самому. Мы напишем простой, в то же время красивый и удобный счетчик на 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:
ШАГ 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








Development — Taras Moroz