2

我有一个网站http://www.gfcf14greendream.com/我发布我的程序和游戏。我编写代码来下载我制作的程序没有问题(点击程序按钮,然后点击短信发送器),但我对如何生成计数器感到很困惑。首先,我不想使用网站上的一个,因为我真的很想自己格式化它。我想这样做的方法是使用一个txt文件,smssender.txt,它简单地有:

0

那么处理txt文件覆盖的站点的javascript是:

$("#downbutton").click(function () {
    downcounter++;
    if (downcounter == 1) $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");
    else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times...");
    $.post("http://www.gfcf14greendream.com/PHP/smssender.php", {
        counter: downcounter
    }, function (data) {});
});

它应该调用一个 PHP 文件 smssender.php,它只有 5 行:

<?php
    $counter = $_POST['counter'];
    file_put_contents("/counters/smssender.txt", $counter);
?>

我希望我知道是否调用了 php 页面,因为更改页面中指示下载时间的文本的代码运行良好,但是一旦刷新页面,下载次数就会回到 0,因为 0 是从此代码中获得的:

var downcounter = 0;
$.get("http://www.gfcf14greendream.com/counters/smssender.txt", function (data) {
    downcounter = data;
    if (downcounter == 1) $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");
    else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times...");
});

这清楚地表明没有发生覆盖,因为它成功地从 smssender.txt 检索到 0(我之前尝试过使用 1 和 2 并且它有效)。那么为什么代码是错误的呢?任何形式的帮助都非常感谢。感谢您的宝贵时间,祝大家新年快乐!!

更新:

我尝试将javascript函数的代码更改为:

var txtfile = "http://www.gfcf14greendream.com/counters/smssender.txt";

            $.ajax({
                type:'POST',
                url: 'PHP/increment.php',
                data: txtfile,
                success: function() {
                    alert("Download incremented");
                    $.get("http://www.gfcf14greendream.com/counters/smssender.txt", function(data){
                        downcounter = data;
                        if (downcounter == 1)   $("#counter").text("SMS Sender has been downloaded " + downcounter + " time...");   
                        else $("#counter").text("SMS Sender has been downloaded " + downcounter + " times..."); 
                    });
                }               
            });

并添加了一个 PHP 文件 increment.php,其中包含您在此处给我的一些代码:

<? php
    $file = $_POST['txtfile'];
    $counter = intval(file_get_contents($file));
    $counter++;
    file_put_contents($file, $counter);
?>

但是,仍然没有运气。这段代码会起作用还是我滥用了引用?谢谢

4

1 回答 1

5

这是构建计数器的简单方法,但存在一些问题。1

与其依赖客户端的 JavaScript 向 提供值counter,不如完全在服务器端处理。例如,如果 2 个用户同时打开页面,则两者都将从相同的值开始,但仅将其递增 1,而不是每个正确递增 1 。

此方法还避免了清理客户端发送并保存在文件中的计数器值的需要,并且完全避免了处理任何帖子的需要。相反,只需调用脚本就可以增加您的计数器。

计数器 PHP 脚本

// Does nothing but read and increment the file:
// Read the value
$current_counter = intval(file_get_contents('/path/outside/web/root/counters/smssender.txt'));
// Increment it
$current_counter++;
file_put_contents('/path/outside/web/root/counters/smssender.txt', $current_counter);
// Output it to the client
echo $current_counter;

JavaScript 的职责就是调用PHP 脚本,没有参数。

$.get("http://www.gfcf14greendream.com/PHP/smssender.php", function(data) {
  // Do something on success
  console.log(data);
});

为了防止对文件的直接请求,smssender.txt建议将该文件存储在 Web 服务器文档根目录之外。提供文件的正确路径在file_get_contents()/file_put_contents().

要检索当前计数器值并将其发送到客户端,您只需读取并回显该值。

echo intval(file_get_contents('/path/outside/web/root/counters/smssender.txt'));

smssender.php最后,请注意,这里没有什么可以阻止任何人通过一遍又一遍地调用脚本来运行您的计数器。如果您有登录名,则应确保用户在访问柜台时已登录。如果没有登录,您应该考虑在下载实际发生时设置一个 cookie 值,这样您就可以在计数器增加时断言用户在当前会话中实际下载了某些内容。

if (isset($_COOKIE['some-download-value'])) {
  // Update the counter.
}

附录:

如果您的 Web 主机不允许您将文件放在 Web 服务器文档根目录之外,您可以在 .htaccess 中使用如下规则阻止对 .txt 文件的直接 HTTP 请求:

# Block direct access to any .txt file
<Files ~ "\.txt$">
  order allow,deny
  deny from all
</Files>

或者您可以将以下内容放在counters/目录内的 .htaccess 文件中:

# counters/.htaccess
# block all HTTP requests to counter files
Order deny,allow
Deny from all

1避免所有文件存储、读取、写入和安全问题的更简单方法是将计数器值存储在数据库表中,UPDATE并在每次访问时存储。

于 2013-01-01T01:14:32.063 回答