Лічильник скачування файлів

11

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

Лічильник скачування файлівЛічильник скачування файлів

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

Отже, в даному уроці нам з Вами необхідно реалізувати лічильник скачування файлів на сторінках сайту. Отже, насамперед необхідно визначитися, де ми будемо зберігати результат підрахунку скачування того чи іншого файлу. На мій погляд, найкращим рішенням є база даних. Тому створимо базу даних dc, в якій далі по ходу уроку створимо дві таблиці – по одній для кожного варіанту реалізації лічильника завантажень.

Варіант №1

Отже, для першого варіанту створюємо таблицю count1 в базі даних dc, з двома полями:

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

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

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


— Структура таблиці `count1`
CREATE TABLE IF NOT EXISTS `count1` (
`name` varchar(255) NOT NULL,
`count` int(11) NOT NULL DEFAULT ‘1’,
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

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

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

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

function connect() {
$db = mysqli_connect(HOST,USER,PASS,DB);
if(mysqli_connect_error($db)) {
exit(mysqli_connect_error($db);
}
return $db;
}

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

function get_count($db) {
$query = «SELECT name,count FROM count1»;
$result = mysqli_query($db,$query);
$arr = array();
for($i = 0; $i < mysqli_num_rows($result);$i++) {
$row = mysqli_fetch_assoc($result);
$arr[$row[‘name’]] = $row[‘count’];
}
return $arr;
}

Файл, який виводить список файлів з папки files, у вигляді посилань, виглядає наступним чином:

«;
echo $str;
}
closedir($handle);
}
?>

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

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

Лічильник скачування файлів

Тепер створимо файл downlad.php і додамо наступний код:

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

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

function update_file($file,$types) {
if(!in_array(substr($file,-3),$types)) {
exit(«NOT Type»);
}
if(!file_exists(DIR.$file)) {
exit(«FILE NOT»);
}
$db = connect();
$query = «INSERT INTO count1 (name, count) VALUES(‘$file’, ‘1’)ON DUPLICATE KEY UPDATE count=(count+1)»;
mysqli_query($db,$query);
if(mysqli_error($db)) {
exit(‘FAULT’);
}
header(«Location:».DIR.$file);
exit();
}
?>

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

Далі виконуємо з’єднання з базою даних і формуємо SQL запит для підрахунку кількості скачування файлу. Зверніть увагу, який ми використовуємо запит:

$query = «INSERT INTO count1 (name, count) VALUES(‘$file’, ‘1’) ON DUPLICATE KEY UPDATE count=(count+1)»;

Перша частина 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 запит для створення таблиці:


— Структура таблиці `count2`

CREATE TABLE IF NOT EXISTS `count2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`count` int(11) NOT NULL DEFAULT ‘1’,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

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

Як зазвичай нам необхідний файл конфігурації, який ми використовуємо з попереднього варіанту даного скрипта. Так само створимо файл d_func.php, в якому будуть описані функції необхідні для роботи скрипта. У файлі d_func.php створимо дві функції:

function connect() {
$db = mysqli_connect(HOST,USER,PASS,DB);
if(mysqli_connect_error($db)) {
exit(mysqli_connect_error($db);
}
return $db;
}
function insert_file($db,$file,$types) {
if(empty($file)) {
$_SESSION[‘fault’] = «Порожнє ім’я файлу»;
return FALSE;
}
if(!in_array(substr($file,-3),$types)) {
$_SESSION[‘fault’] = «Не вірний тип файлу»;
return FALSE;
}
if(!file_exists(DIR.$file)) {
$_SESSION[‘fault’] = «Даного файлу немає»;
return FALSE;
}
$query = «INSERT IGNORE INTO count2 (name) VALUES(‘$file’)»;
mysqli_query($db,$query);
if(!mysqli_error($db)) {
$_SESSION[‘fault’] = mysqli_error($db);
return FALSE;
}
return TRUE;
}

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

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

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

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

function get_count($db) {
$query = «SELECT id,name,count FROM count2»;
$result = mysqli_query($db,$query);
if(!$result) {
return FALSE;
}
for($i = 0; $i < mysqli_num_rows($result);$i++) {
$row[] = mysqli_fetch_assoc($result);
}
return $row;
}

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

Файли

>

Новий файл

>

Файли

>
>

id Ім’я Завантажили Посилання
download.php?id=

Як зазвичай спочатку підключаємо необхідні файли і виконуємо підключення до бази даних. Потім ми додаємо новий файл, використовуючи звичайну форму, значить, як тільки прийдуть дані методом POST – викличемо функцію insert_file(), тобто додамо новий файл бази даних. Далі виконуємо перенаправлення на цю сторінку, для очищення даних у суперглобальном масиві $_POST, і викликаємо функцію get_count(), що б переглянути, які файли вже додані в базу даних і скільки разів їх скачували. Далі виводимо файли на екран в потрібному форматі, єдине, я додав перевірку наявності файлу при його виведенні на екран. Це потрібно для того що б, файли які дійсно присутні в папці files – відображати зелених кольором, ні – червоним.

Ось, що ми побачимо на екрані браузера, після додавання декількох файлах.

Лічильник скачування файлів

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

Файли

Файли

>
()

Як зазвичай шлях посилання формуємо наступним чином – спочатку вказуємо файл обробник (який виконає підрахунок кількості скачування), потім передаємо, використовуючи GET параметри, ідентифікатор файлу, який намагається завантажити користувач. Тепер створимо файл download.php:

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

function update_count($db,$id) {
$query = «SELECT count,name FROM count2 WHERE id=’$id'»;
$result = mysqli_query($db,$query);
$res = mysqli_fetch_row($result);
if(count($res) == 0) {
exit(«Немає файлу в базі»);
}
if(!file_exists(DIR.$res[1])) {
exit(‘Такого файлу немає’);
}
$count_f = $res[0]+1;
$sql = «UPDATE count2 SET count=’$count_f’ WHERE id=’$id'»;
$result = mysqli_query($db,$sql);
if(mysqli_error($db)) {
exit(mysqli_error($db);
}
if(mysqli_affected_rows($db) != 1) {
exit(‘Помилка’);
}
header(«Location:».DIR.$res[1]);
exit();
}

Дана функція приймає в якості параметрів змінну $db – дескриптор підключення до бази даних і змінну $id – ідентифікатор файлу, що завантажується. Насамперед необхідно переконатися, що файл з переданим ідентифікатором дійсно існує в базі даних. При цьому отримаємо його ім’я. Далі перевіряємо наявність файл з певним ім’ям папки завантажень – файли. І якщо цей файл дійсно існує – оновлюємо запис у таблиці. А саме збільшуємо поточне значення поля count на одиницю. Далі, використовуючи функцію header(), віддаємо файл користувачеві на скачування.

Давайте подивимося, що у нас вийшло:

Лічильник скачування файлів

Як Ви бачите, все успішно працює. На цьому даний урок завершено. Всього Вам доброго і вдалого кодування!!!