使用Ajax的JQuery POST覆盖txt文件无法正常工作

gfc*_*f14 2 javascript php ajax jquery overwrite

我有一个网站http://www.gfcf14greendream.com/我在哪里发布我的程序和游戏.我编写代码来下载我制作的程序没有问题(单击"程序"按钮然后发送SMS Sender),但我对如何生成计数器感到困惑.在此之前,我不想在网站上使用它,因为我真的想自己格式化.我想这样做的方法是使用一个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) {});
});
Run Code Online (Sandbox Code Playgroud)

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

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

我希望我知道是否正在调用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...");
});
Run Code Online (Sandbox Code Playgroud)

这清楚地表明没有覆盖发生,因为它成功地从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..."); 
                    });
                }               
            });
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mic*_*ski 5

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

counter它应该完全在服务器端处理,而不是依赖客户端的JavaScript来提供值.如果用户在页面同时打开示例中,将使用相同的值开始,但仅由一个递增它,而不是通过一个适当增加每个.

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

反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;
Run Code Online (Sandbox Code Playgroud)

JavaScript的责任只是调用 PHP脚本,没有参数.

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

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

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

echo intval(file_get_contents('/path/outside/web/root/counters/smssender.txt'));
Run Code Online (Sandbox Code Playgroud)

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

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

附录:

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

# Block direct access to any .txt file
<Files ~ "\.txt$">
  order allow,deny
  deny from all
</Files>
Run Code Online (Sandbox Code Playgroud)

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

# counters/.htaccess
# block all HTTP requests to counter files
Order deny,allow
Deny from all
Run Code Online (Sandbox Code Playgroud)

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