我只是想计算一个按钮的点击次数并将点击量保存到文本文件中,但我似乎无法使这些代码生效。它不会节省点击次数。
在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 :(得分: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);
?>