php - JQuery POST 使用 Ajax 覆盖 txt 文件不起作用

标签 php javascript jquery ajax overwrite

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

但是,还是没有运气。这段代码到底能起作用还是我滥用了引用?谢谢

最佳答案

这是构建计数器的简单方法,但存在一些问题。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 值,这样您就可以在计数器增加时断言用户实际上已经在当前 session 中下载了某些内容。

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 一种更简单的方法可以避免所有文件存储、读取、写入和安全问题,即将计数器值存储在数据库表中,然后更新每次访问。

关于php - JQuery POST 使用 Ajax 覆盖 txt 文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107158/

相关文章:

jquery - 甜蜜的警报输入不专注于 jquery ui 模式

javascript - 绑定(bind)到流程图.js 中的行

php - 通过 PHP 和 MySQL 插入 ID

php - 使用 PHP 访问网络摄像头?

javascript - 如何将滚动条添加到 Jquery 对话框

javascript - 有没有办法用纯javascript将图像复制到剪贴板而无需库?

php - 正则表达式:匹配所有内容,直到新行后面没有空格

PHP 调试问题 - 没有日志,没有错误

javascript - 在聊天框中突出显示关键字,如何为多个关键字添加不同的样式?

jquery - 使用 jQuery UI 启用在叠加层下方的元素中拖动