0

我正在尝试在一个网站中为 PHP 中的视频游戏创建一个下载计数器,但由于某种原因,它不是将 downloadcount.txt 文件的内容增加 1,而是获取数字,增加它,并将其附加到文件的结尾。我怎样才能让它替换文件内容而不是附加它?

这是来源:

<?php
    ob_start();
    $newURL = 'versions/v1.0.0aplha/Dungeon1UP.zip';
    //header('Location: '.$newURL);
    //increment download counter
    $file = fopen("downloadcount.txt", "w+") or die("Unable to open file!");
    $content = fread($file,filesize("downloadcount.txt"));
    echo $content;
    $output = (int) $content + 1;
    //$output = 'test';
    fwrite($file, $output);
    fclose($file);
    ob_end_flush();
?>

文件中的数字应该每次增加一,但它给了我这样的数字:101110121011101310111012101110149.2233720368548E+189.2233720368548E+189.2233720368548E+18

4

4 回答 4

1

file_get_contents使用/会简单得多file_put_contents

// update with more precise path to file:
$content = file_get_contents(__DIR__ . "/downloadcount.txt");
echo $content;
$output = (int) $content + 1;
// by default `file_put_contents` overwrites file content
file_put_contents(__DIR__ . "/downloadcount.txt", $output);
于 2019-08-26T13:06:03.860 回答
1

该附加应该只是一个类型转换问题,但我不鼓励您以文件方式处理计数。为了计算文件的下载次数,最好使用事务 对行进行数据库更新以正确处理并发,因为这样做可能会影响准确性。

于 2019-08-26T13:20:50.683 回答
1

正如其中一条评论正确指出的那样,对于您的具体情况,您可以在写作之前使用 fseek ( $file, 0 ),例如:

fseek ( $file, 0 );
fwrite($file, $output);

或者更简单,您可以在写入之前 rewind($file),这将确保下一次写入发生在字节 0 - 即文件的开头。

文件被附加的原因是因为您以附加和截断模式打开文件,即“w+”。如果您不想重置内容,则必须以读写模式打开它,只需在 fopen 上使用“r+”,例如:

fopen("downloadcount.txt", "r+")

只需在写入之前确保文件存在!

请在此处查看 fopen 模式: https ://www.php.net/manual/en/function.fopen.php

和工作代码在这里: https ://bpaste.net/show/iasj

于 2019-08-26T13:22:57.420 回答
0

您可以获取内容,检查文件是否有数据。如果未初始化为 0,则只需替换内容。

$fileContent = file_get_contents("downloadcount.txt");
$content     = (!empty($fileContent) ? $fileContent : 0);
$content++;
file_put_contents('downloadcount.txt', $content);

检查$str或直接检查文件内的内容

于 2019-08-26T13:09:55.040 回答