我有一个网站 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/