2012-06-22 99 views
2

我只是想統計一個按鈕的點擊並將點擊量保存到一個文本文件,但我似乎無法得到此代碼的工作。它不會節省點擊量。簡單的按鈕點擊計數器使用PHP,AJAX和JavaScript

在HTML文件中我一直在使用onClick運行JavaScript的一個按鈕:

function do() { 
    if (window.XMLHttpRequest){ 
       xhr = new XMLHttpRequest() 
    } 
    else 
    { 
    if (window.ActiveXObject){ 
       var xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       } 
      xhr.open('GET','count.php',false); 
      xhr.onreadystatechange = function() { 
       if(xhr.readyState === 4 && xhr.status === 200) { 
        while(results.hasChildNodes()) { 
         results.removeChild(results.lastChild); 
        } 
        results.appendChild(document.createTextNode(xhr.responseText)); 
       } 
      } 
      xhr.send(); 
    } 

在我們所謂的PHP文件中,我們有下面的代碼:

<?php 

    $clicks = file_get_contents("clicks.txt"); 
    $clicks++; 

    $fp = fopen("clicks.txt", "w+"); 

    while (!flock($fp, LOCK_EX)) {  
     usleep(500000); // Delay half a second 
    } 

    fwrite($fp, $clicks); 
    fclose($fp); 
    flock($fp, LOCK_UN); 

?> 

你能幫助我在我的代碼中找到問題?
我如何閱讀另一個HTML頁面中的文本文件?
(只顯示文本文件的信息。)

+0

你的代碼有什麼問題? – andrewsi

+0

對不起,請參閱編輯。 – user1431627

+0

你可以直接在瀏覽器中訪問你的PHP文件,看看會發生什麼? – andrewsi

回答

1

假設PHP頁面是否正常工作,下面應該工作:

<html> 
    <head> 
     <title>Example</title> 
    </head> 
    <body> 
     <script type="text/javascript"> 

function getXMLHttp() 
{ 
    var xmlHttp 
    try 
    { 
    xmlHttp = new XMLHttpRequest(); 
    } 
    catch(e) 
    { 
    try 
    { 
     xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch(e) 
    { 
     try 
     { 
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     catch(e) 
     { 
     alert("AJAX not supported.") 
     return false; 
     } 
    } 
    } 
    return xmlHttp; 
} 

function MakeRequest() 
{ 
    var xmlHttp = getXMLHttp(); 
    xmlHttp.onreadystatechange = function() 
    { 
    if(xmlHttp.readyState == 4) 
    { 
     HandleResponse(xmlHttp.responseText); 
    } 
    } 
    xmlHttp.open("GET", "count.php", true); 
    xmlHttp.send(null); 
} 

function HandleResponse(response) 
{ 
    document.getElementById('ResponseDiv').innerHTML = response; 
} 
     </script> 
     <input type='button' onclick='MakeRequest();' value='Button'/> 
     <br /> 
     <br /> 
     <div id='ResponseDiv'> 
      Count 
     </div> 
    </body> 
</html> 
+0

我必須使用try catch嗎? – user1431627

+0

是的,正確的錯誤處理很重要,在不支持'AJAX'的情況下執行'AJAX'請求是絕對沒有意義的,並且可能會導致錯誤。 – Anne

+0

如果Ajax不起作用,我不想打擾用戶。是否可以刪除它? – user1431627

1

有幾件事情,這裏要注意在PHP端。

1)您打開的文件是w +,用於編寫和閱讀您寫的內容。這也會在您的鎖定到位之前截斷您的文件。

2)您的鎖將導致並行讀取和寫入失敗。這可以將$點擊設置爲false,並且如果在fopen被調用之前解鎖文件可能會清除你的計數器。

3)由於在鎖定處於活動狀態時關閉手柄,因此您沒有正確釋放鎖定。如果這是一個長時間運行的腳本,則在腳本終止之前不會釋放鎖。

這應該解決所有這些問題。

<?php 

$fp = false; 
// Open file for reading, then writing 
while (($fp=fopen('clicks.txt','r+'))===false) { 
    usleep(250000); // Delay 1/4 second 
} 
// Obtain lock 
while (!flock($fp, LOCK_EX)) {  
    usleep(250000); // Delay 1/4 second 
} 
// Read Clicks 
$clicks = trim(fread($fp,1024)); 
// Add click 
$clicks++; 
// Empty file 
ftruncate($fp,0); 
// Write clicks 
fwrite($fp, $clicks); 
// Release Lock 
flock($fp, LOCK_UN); 
// Release handle 
fclose($fp); 

?> 
+0

如何在完整的不同網頁中顯示文本文件的內容? – user1431627

+0

只需以只讀方式打開文件(r),就可以使用讀取鎖而不是排它鎖,以便此腳本無法在讀取過程中阻止您。您應該將fopen和flock調用放在一個循環中,因爲您使用不同的腳本來鎖定它。如果你只是使用數據庫,這種事情更容易。 :) –

+0

好的。我要去當我得到一臺服務器。我已經寫了XML請求thingy ...我只是使用它並重新編程我的PHP將其保存到服務器? – user1431627