使用PHP,AJAX和JavaScript的简单按钮点击计数器

时间:2012-06-22 16:57:08

标签: php

我只是想计算一个按钮的点击次数并将点击量保存到文本文件中,但我似乎无法使这些代码生效。它不会节省点击次数。

在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页面中的文本文件?
(只显示文本文件的信息。)

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

在php方面需要注意的一些事项。

1)你用w +打开文件,用于写和读你写的东西。这也会在您的锁定到位之前截断您的文件。

2)您的锁将导致并行读取和写入失败。这可以将$ clicks设置为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);

?>
相关问题