簡體   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