Есть ли любая альтернатива file_get_contents, который создал бы файл, если бы это не существовало. Я в основном ищу одну команду строки. Я использую его для подсчета статистики загрузки для программы. Я использую этот код PHP на странице перед загрузкой:
Download #: <?php $hits = file_get_contents("downloads.txt"); echo $hits; ?>
и затем на странице загрузки, у меня есть это.
<?php
function countdownload($filename) {
if (file_exists($filename)) {
$count = file_get_contents($filename);
$handle = fopen($filename, "w") or die("can't open file");
$count = $count + 1;
} else {
$handle = fopen($filename, "w") or die("can't open file");
$count = 0;
}
fwrite($handle, $count);
fclose($handle);
}
$DownloadName = 'SRO.exe';
$Version = '1';
$NameVersion = $DownloadName . $Version;
$Cookie = isset($_COOKIE[str_replace('.', '_', $NameVersion)]);
if (!$Cookie) {
countdownload("unqiue_downloads.txt");
countdownload("unique_total_downloads.txt");
} else {
countdownload("downloads.txt");
countdownload("total_download.txt");
}
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$DownloadName.'" />';
?>
Естественно, хотя, пользователь получает доступ к странице перед загрузкой сначала, таким образом, не созданный все же. Я не хочу добавлять любые функции к пред страница загрузки, я хочу, чтобы она была проста и проста и не большое добавление/изменение.
Править:
Что-то вроде этого работало бы, но не работа для меня?
$count = (file_exists($filename))? file_get_contents($filename) : 0; echo $count;
Download #: <?php
$hits = '';
$filename = "downloads.txt";
if (file_exists($filename)) {
$hits = file_get_contents($filename);
} else {
file_put_contents($filename, '');
}
echo $hits;
?>
Вы также можете использовать fopen()
с режимом 'w+':
Download #: <?php
$hits = 0;
$filename = "downloads.txt";
$h = fopen($filename,'w+');
if (file_exists($filename)) {
$hits = intval(fread($h, filesize($filename)));
}
fclose($h);
echo $hits;
?>
Подобное жонглирование типами может привести к сумасшедшим, непредвиденным проблемам в дальнейшем. чтобы превратить строку в целое число, вы можете просто добавить целое число 0 к любой строке.
Например:
$f = file_get_contents('file.php');
$f = $f + 0;
echo is_int($f); //will return 1 for true
Однако я поддерживаю идею использования базы данных вместо текстового файла. Есть несколько способов сделать это. Один из способов - вставлять уникальную строку в таблицу под названием "download_count" каждый раз, когда кто-то скачивает файл. Запрос прост: "insert into download_count $randomValue" - убедитесь, что индекс уникален. Затем просто подсчитайте количество строк в этой таблице, когда вам понадобится количество. Количество строк - это количество скачиваний. или сделайте поле в таблице 'download file', в котором будет целое число download count. каждый файл должен быть в базе данных с id в любом случае. когда кто-то скачивает файл, возьмите это число из базы данных в вашей функции загрузки, поместите его в переменную, увеличьте, обновите таблицу и покажите ее на клиенте, как хотите. используйте PHP с jQuery Ajax для асинхронного обновления, чтобы сделать это круто.
Я бы все же использовал php и jquery.load(file.php), если вы настаиваете на использовании текстового файла. Таким образом, вы можете использовать ваш текстовый файл для хранения любого типа данных и просто загрузить определенную часть текстового файла с помощью контекстных селекторов. file.php принимает запрос $_GET, загружает нужную часть файла и считывает число, хранящееся в файле. затем он увеличивает число, хранящееся в файле, обновляет файл и отправляет данные обратно на клиент для отображения любым способом. Например, вы можете иметь div в вашем текстовом файле с id, установленным на 'downloadcount', и div с id для любых других данных, которые вы хотите хранить в этом файле. Когда вы загружаете file.php, вы просто посылаете div#download_count вместе с именем файла, и он будет загружать только значение, сохраненное в этом div. Это убийственный способ использовать php и jquery для крутых и простых приложений, управляемых Ajax/данными. Не превращайте это в тему о jquery, но это настолько просто, насколько это возможно.