2

ボタンのクリック数を数えて、クリック数をテキスト ファイルに保存したいだけですが、このコードを機能させることができないようです。クリック数は保存されません。

HTML ファイルには、次を使用して JavaScript を実行するボタンがありますonClick

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 ページでテキスト ファイルを読み取るにはどうすればよいでしょうか。
(テキストファイルの情報を表示するだけです。)

4

2 に答える 2

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);

?>
于 2012-06-22T17:47:08.183 に答える
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>
于 2012-06-22T17:19:18.430 に答える