file_get_contents创建文件不存在

时间:2010-07-16 14:34:10

标签: php

如果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;

3 个答案:

答案 0 :(得分:11)

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;
?>

答案 1 :(得分:2)

像这样的类型杂耍可能会导致以后出现疯狂的,无法预料的问题。要将字符串转换为整数,您只需将整数0添加到任何字符串即可。

例如:

$f = file_get_contents('file.php');
$f = $f + 0;
echo is_int($f); //will return 1 for true

然而,我第二次使用数据库而不是文本文件。有几种方法可以解决它。一种方法是在每次有人下载文件时将唯一字符串插入名为“download_count”的表中。查询就像“插入download_count $ randomValue”一样简单 - 确保索引是唯一的。然后,只需在需要计数时计算此表中的行数。行数是下载次数。你有一个真正的整数而不是假装是一个整数的字符串。或者在“下载文件”表中创建一个具有下载计数整数的字段。无论如何,每个文件都应该在一个带有id的数据库中。当有人下载​​文件时,从下载功能中的数据库中提取该数字,将其放入变量,增量,更新表中,然后根据需要在客户端上显示。使用PHP与jQuery Ajax异步更新它以使其很酷。

如果你坚持使用文本文件,我仍然会使用php和jquery.load(file.php)。这样,您可以使用文本文件存储任何类型的数据,并使用上下文选择器加载文本文件的特定部分。 file.php接受$ _GET请求,加载文件的正确部分并读取存储在文件中的数字。然后,它会增加存储在文件中的数字,更新文件并将数据发送回客户端,以便以任何方式显示。例如,您可以在文本文件中将div设置为“downloadcount”,并将div设置为您要存储在此文件中的任何其他数据的ID。当你加载file.php时,你只需发送div#download_count和文件名,它只会加载存储在该div中的值。这是一种使用php和jquery来实现酷炫易用的Ajax /数据驱动应用程序的杀手级方法。不要把它变成一个jquery线程,但这很简单。

答案 2 :(得分:0)

您可以使用更简洁的等效功能 countdownload

function countdownload($filename) {

    if (file_exists($filename)) {

        file_put_contents($filename, 0);

    } else {

        file_put_contents($filename, file_get_contents($filename) + 1);
    }
}