繁体   English   中英

使用Ajax的jQuery POST覆盖txt文件不起作用

[英]JQuery POST with Ajax to overwrite txt file not working

我有一个网站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) {});
});

应该调用一个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);
?>

但是,仍然没有运气。 该代码将完全起作用,还是我滥用引用? 谢谢

这是构建计数器的简单方法,但是存在一些问题。 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服务器文档root之外 file_get_contents()/file_put_contents()文件的正确路径。

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

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

最后,请注意,这里没有什么可以阻止任何人通过smssender.php调用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM