Счётчик скачиваний на PHP и JavaScript
15.04.2018 12:59:26 pm
Привет! Вот есть такой счётчик: Счётчик скачиваний файлов на PHP, этот счётчик давно устарел, но мне подходит, есть только небольшое пожелание доработать его, что именно:
1. Код счётчика не должен повторяться, не надо его плодить.
2. Обновление счётчика должно происходить без перезагрузки страницы, сразу после нажатия.
3. Файлы с количеством скачиваний должны находится в папке count.
Если поможете с реализацией такого счётчика буде честен рассчитаться за помощь.
1. Код счётчика не должен повторяться, не надо его плодить.
2. Обновление счётчика должно происходить без перезагрузки страницы, сразу после нажатия.
3. Файлы с количеством скачиваний должны находится в папке count.
Если поможете с реализацией такого счётчика буде честен рассчитаться за помощь.
- Жалоба
15.04.2018 02:29:10 pm
Давайте попробуем. Код выводит количество скачиваний каждому файлу:
Переменная
Если на сайте используется библиотека jQuery, можно сделать по примеру из статьи: Динамическое обновление контента (без перезагрузки страницы Ajax jQuery).
Файл "count.php" выглядит примерно так:
$fileIds = array(1, 2, 3, 4, 5); // Массив с номерами (Идентификаторы файлов)
$counDir = 'count/'; // Директория файлов счетчика
foreach ($fileIds as $id)
{
$countFile = $id . '.txt'; // Полное название файла
// Проверка: существует ли файл счетчика
if (!file_exists($counDir . $countFile))
{
// Если файл счетчика не существует, его необходимо создать
$fp = fopen($counDir . $countFile, 'w'); // Создание файла
fwrite($fp, 0); // Запись в файл ноль ("0")
fclose($fp); // Сохранение и закрытие файла
}
// Чтение файла (Получение значения счетчика)
$count = file_get_contents($counDir . $countFile);
echo '<br />Количество скачиваний / обращений: <span id="countSpan_' . $id . '">' . $count . '</span>';
echo '<br /><a href="#" onclick="job(' . $id . ');" target="_blank">Скачать</a>';
}
Переменная
$fileIds
может назначаться путем получения нужных id файлов из БД. В ссылку (href="#"
) следует вставлять url файла. Для обновления счетчика без перезагрузки страницы потребуется Ajax, я взял код от сюда: Ajax на чистом JavaScript:<script type="text/javascript">
function job(value) {
var inquiry = new XMLHttpRequest();
inquiry.open('GET', 'count.php?job=' + value, true);
inquiry.send();
inquiry.onreadystatechange = function() {
if (this.readyState != 4) {
return false;
};
if (this.status != 200) {
return false;
};
document.getElementById('countSpan_' + value).innerHTML = this.responseText;
};
};
</script>
Если на сайте используется библиотека jQuery, можно сделать по примеру из статьи: Динамическое обновление контента (без перезагрузки страницы Ajax jQuery).
Файл "count.php" выглядит примерно так:
<?php
if (!empty($_GET['job']))
{
$number = $_GET['job'];
$value = file_get_contents('count/' . $number . '.txt');
$value++;
file_put_contents('count/' . $number . '.txt', $value);
echo $value;
}
15.04.2018 06:51:49 pm
Извините, я действительно выразился непонятно. Объясню подробней. Вот id файлов написаны в массиве:
С этого массива цифры попадают в цикл и с каждым проходом подставляется по одной цифре в переменной $id. Так вот, мне же ещё надо переменную, которая будет заменять адреса к файлам. Где её взять?
Я подумывал, что можно создать файлы с названием 1.exe, 2.exe, 3.exe, тогда строку:
Поправить так:
Так работает, но хотелось, чтобы названия файлов оставались с оригинальным названием: em_PS.exe, em_Dandy.exe. Если такое сделать невозможно, то я остановлюсь на моей задумке.
$fileIds = array(1, 2, 3, 4, 5); // Массив с номерами (Идентификаторы файлов)
С этого массива цифры попадают в цикл и с каждым проходом подставляется по одной цифре в переменной $id. Так вот, мне же ещё надо переменную, которая будет заменять адреса к файлам. Где её взять?
Я подумывал, что можно создать файлы с названием 1.exe, 2.exe, 3.exe, тогда строку:
echo '<br /><a href="#" onclick="job(' . $id . ');" target="_blank">Скачать</a>';
Поправить так:
echo '<br /><a href="file/' . $id . '.exe" onclick="job(' . $id . ');" target="_blank">Скачать</a>';
Так работает, но хотелось, чтобы названия файлов оставались с оригинальным названием: em_PS.exe, em_Dandy.exe. Если такое сделать невозможно, то я остановлюсь на моей задумке.
15.04.2018 07:23:02 pm
Ну почему не возможно, это сделать возможно! Меняем наш массив:
На:
Названия файлов додумал сам, измените, как надо. Дальше, строку:
Меняем на:
Строку:
Меняем на:
Теперь остаются оригинальные названия файлов.
$fileIds = array(1, 2, 3, 4, 5); // Массив с номерами (Идентификаторы файлов)
На:
// Массив с номерами (Идентификаторы файлов)
$fileIds = array(
1 => 'em_PS.exe',
2 => 'em_Dandy.exe',
3 => 'em_Sega.exe',
4 => 'em_Tetris.exe',
5 => 'em_Wii.exe'
);
Названия файлов додумал сам, измените, как надо. Дальше, строку:
foreach ($fileIds as $id)
Меняем на:
foreach ($fileIds as $id => $file)
Строку:
echo '<br /><a href="#" onclick="job(' . $id . ');" target="_blank">Скачать</a>';
Меняем на:
echo '<br /><a href="file/' . $file . '" onclick="job(' . $id . ');" target="_blank">Скачать</a>';
Теперь остаются оригинальные названия файлов.
15.04.2018 07:47:11 pm
Если потребуется вывести дополнительную информация, по файлу, например, название файла, оригинальное имя, вес и дату релиза, то можно изменить массив таким образом:
И далее "кучка" правок, я приведу код полностью:
JS и файл count.php без изменений.
// Массив с номерами (Идентификаторы файлов)
$files = array(
1 => array('name' => 'PS', 'file' => 'em_PS.exe', 'weight' => '12Mb', 'release' => '12.12.2010'),
2 => array('name' => 'Dandy', 'file' => 'em_Dandy.exe', 'weight' => '5Mb', 'release' => '7.04.2008'),
3 => array('name' => 'Sega', 'file' => 'em_Sega.exe', 'weight' => '8Mb', 'release' => '5.02.2012'),
4 => array('name' => 'Tetris', 'file' => 'em_Tetris.exe', 'weight' => '1Mb', 'release' => '17.09.2007'),
5 => array('name' => 'Wii', 'file' => 'em_Wii.exe', 'weight' => '17Mb', 'release' => '2.10.2017')
);
И далее "кучка" правок, я приведу код полностью:
// Массив с номерами (Идентификаторы файлов)
$files = array(
1 => array('name' => 'PS', 'file' => 'em_PS.exe', 'weight' => '12Mb', 'release' => '12.12.2010'),
2 => array('name' => 'Dandy', 'file' => 'em_Dandy.exe', 'weight' => '5Mb', 'release' => '7.04.2008'),
3 => array('name' => 'Sega', 'file' => 'em_Sega.exe', 'weight' => '8Mb', 'release' => '5.02.2012'),
4 => array('name' => 'Tetris', 'file' => 'em_Tetris.exe', 'weight' => '1Mb', 'release' => '17.09.2007'),
5 => array('name' => 'Wii', 'file' => 'em_Wii.exe', 'weight' => '17Mb', 'release' => '2.10.2017')
);
$counDir = 'count/'; // Директория файлов счетчика
$c = count($files);
for ($i = 1; $c >= $i; $i++)
{
$countFile = $i . '.txt'; // Полное название файла
// Проверка: существует ли файл счетчика
if (!file_exists($counDir . $countFile))
{
// Если файл счетчика не существует, его необходимо создать
$fp = fopen($counDir . $countFile, 'w'); // Создание файла
fwrite($fp, 0); // Запись в файл ноль ("0")
fclose($fp); // Сохранение и закрытие файла
}
// Чтение файла (Получение значения счетчика)
$count = file_get_contents($counDir . $countFile);
echo '<br />Название: <strong>' . $files[$i]['name'] . '</strong>';
echo '<br />Размер: <strong>' . $files[$i]['weight'] . '</strong> Релиз: <strong>' . $files[$i]['release'] . '</strong>';
echo '<br />Количество скачиваний / обращений: <span id="countSpan_' . $i . '">' . $count . '</span>';
echo '<br /><a href="file/' . $files[$i]['file'] . '" onclick="job(' . $i . ');" target="_blank">Скачать</a>';
}
JS и файл count.php без изменений.
16.04.2018 06:11:49 pm
// Массив с номерами (Идентификаторы файлов)
$files = array(
1 => array('name' => 'PS', 'file' => 'em_PS.exe', 'weight' => '12Mb', 'release' => '12.12.2010'),
2 => array('name' => 'Dandy', 'file' => 'em_Dandy.exe', 'weight' => '5Mb', 'release' => '7.04.2008'),
3 => array('name' => 'Sega', 'file' => 'em_Sega.exe', 'weight' => '8Mb', 'release' => '5.02.2012'),
4 => array('name' => 'Tetris', 'file' => 'em_Tetris.exe', 'weight' => '1Mb', 'release' => '17.09.2007'),
5 => array('name' => 'Wii', 'file' => 'em_Wii.exe', 'weight' => '17Mb', 'release' => '2.10.2017')
);
$counDir = 'count/'; // Директория файлов счетчика
$c = count($files);
for ($i = 1; $c >= $i; $i++)
{
$countFile = $i . '.txt'; // Полное название файла
// Проверка: существует ли файл счетчика
if (!file_exists($counDir . $countFile))
{
// Если файл счетчика не существует, его необходимо создать
$fp = fopen($counDir . $countFile, 'w'); // Создание файла
fwrite($fp, 0); // Запись в файл ноль ("0")
fclose($fp); // Сохранение и закрытие файла
}
// Чтение файла (Получение значения счетчика)
$count = file_get_contents($counDir . $countFile);
if (strpos($count, '|') !== false)
{
list($count, $time) = explode('|', $count);
}
echo '<br />Название: <strong>' . $files[$i]['name'] . '</strong>';
echo '<br />Размер: <strong>' . $files[$i]['weight'] . '</strong> Релиз: <strong>' . $files[$i]['release'] . '</strong>';
echo '<br />Количество скачиваний / обращений: <span id="countSpan_' . $i . '">' . $count . '</span>';
if (!empty($time))
{
echo ' Последнее скачивание: ' . date('l G:i:s d.n.Y', $time);
}
echo '<br /><a href="file/' . $files[$i]['file'] . '" onclick="job(' . $i . ');" target="_blank">Скачать</a>';
unset($time);
}
Файл "count.php":
<?php
if (!empty($_GET['job']))
{
$number = $_GET['job'];
$file = 'count/' . $number . '.txt';
$count = file_get_contents($file);
if (strpos($count, '|') !== false)
{
list($count, $time) = explode('|', $count);
}
$count++;
echo $count;
$value = $count . '|' . time();
file_put_contents($file, $value);
}
Поправил некоторые свои ошибки.
17.04.2018 07:41:26 am
Office, почему Вы не хотите использовать для этого базу данных SQL? Это же в разы удобнее! Всю инфу о файлах держать в базе, в том числе и счетчик и не пришлось бы создавать кучу текстовых файлов, для каждого файла отдельно. Тут есть пример, как сделать прибавление: Увеличить значение поля на 1 (MySQLi) весь остальной код у Вас уже есть.
[quote=795 post=2118]em_Dandy.exe
[quote=795 post=2118]em_Dandy.exe
Dandy - это восьмибитная консоль? Если да, то пишется так Dendy.
17.04.2018 09:54:17 am
Slash, спасибо за помощь, всё получилось! Объясните только, что это значит: unset($time);, зачем удалять переменную в цикле, может это лучше вынести за цикл?
Slash, напишите в личку свой номер счёта, я Вам переведу несколько баксов, как и писал выше.
Scorpion, я только начинаю вникать в программирование на php и мне ещё трудно понять, как устроен sql, а вот работать с файлами мне понятнее. Как только освою sql, так буду переделывать скрипт для работы с базой данных.
За найденную ошибку спасибо!
Slash, напишите в личку свой номер счёта, я Вам переведу несколько баксов, как и писал выше.
Scorpion, я только начинаю вникать в программирование на php и мне ещё трудно понять, как устроен sql, а вот работать с файлами мне понятнее. Как только освою sql, так буду переделывать скрипт для работы с базой данных.
За найденную ошибку спасибо!