Счётчик скачиваний на PHP и JavaScript

Привет! Вот есть такой счётчик: Счётчик скачиваний файлов на PHP, этот счётчик давно устарел, но мне подходит, есть только небольшое пожелание доработать его, что именно:
1. Код счётчика не должен повторяться, не надо его плодить.
2. Обновление счётчика должно происходить без перезагрузки страницы, сразу после нажатия.
3. Файлы с количеством скачиваний должны находится в папке count.

Если поможете с реализацией такого счётчика буде честен рассчитаться за помощь.
Давайте попробуем. Код выводит количество скачиваний каждому файлу:
$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;
}
Slash, Ваш код в таком виде, как Вы его написали работает. Мне лишь непонятно это:
В ссылку (href="#") следует вставлять url файла.

От куда мне брать адреса на файлы, чтобы подставлять их внутри цикла?
Не понял, что значит "от куда брать адреса"? Вводите реальные адреса, по которым находятся файлы, которые ждут, когда их скачают.
Извините, я действительно выразился непонятно. Объясню подробней. Вот id файлов написаны в массиве:
$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. Если такое сделать невозможно, то я остановлюсь на моей задумке.
Ну почему не возможно, это сделать возможно! Меняем наш массив:
$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>';

Теперь остаются оригинальные названия файлов.
Если потребуется вывести дополнительную информация, по файлу, например, название файла, оригинальное имя, вес и дату релиза, то можно изменить массив таким образом:
// Массив с номерами (Идентификаторы файлов)
$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 без изменений.
Slash, отличная работа! Спасибо! Про дополнительную информацию я не подумал, а её выводит надо.
Можно ещё сделать вывод времени последнего скачивания?
// Массив с номерами (Идентификаторы файлов)
$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);
}

Поправил некоторые свои ошибки.
Office, почему Вы не хотите использовать для этого базу данных SQL? Это же в разы удобнее! Всю инфу о файлах держать в базе, в том числе и счетчик и не пришлось бы создавать кучу текстовых файлов, для каждого файла отдельно. Тут есть пример, как сделать прибавление: Увеличить значение поля на 1 (MySQLi) весь остальной код у Вас уже есть.
[quote=795 post=2118]em_Dandy.exe

Dandy - это восьмибитная консоль? Если да, то пишется так Dendy.
Slash, спасибо за помощь, всё получилось! Объясните только, что это значит: unset($time);, зачем удалять переменную в цикле, может это лучше вынести за цикл?
Slash, напишите в личку свой номер счёта, я Вам переведу несколько баксов, как и писал выше.

Scorpion, я только начинаю вникать в программирование на php и мне ещё трудно понять, как устроен sql, а вот работать с файлами мне понятнее. Как только освою sql, так буду переделывать скрипт для работы с базой данных.
За найденную ошибку спасибо!