Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 文件中的计数器不递增_Php_Ajax - Fatal编程技术网

Php 文件中的计数器不递增

Php 文件中的计数器不递增,php,ajax,Php,Ajax,我在服务器上有一个带计数器的文件。 单击链接时,我会向一个php文件发送一个ajax请求,该文件会增加文件中的计数器。问题是,文件已创建,但计数器未递增 当我直接执行ajax文件时,计数器是递增的。 你明白为什么会发生这种影响吗 链接: <p><a onclick="incCounter('TL1');" href="index.html">Dies ist Testlink1</a></p> <p><a onclick="inc

我在服务器上有一个带计数器的文件。 单击链接时,我会向一个php文件发送一个ajax请求,该文件会增加文件中的计数器。问题是,文件已创建,但计数器未递增

当我直接执行ajax文件时,计数器是递增的。 你明白为什么会发生这种影响吗

链接:

<p><a onclick="incCounter('TL1');" href="index.html">Dies ist Testlink1</a></p>
<p><a onclick="incCounter('TL2');" href="index.html">Dies ist Testlink2</a></p>
ajax文件:

  $element = $_GET["e"];
  //$element = "testdatei";
  $filename = "clickcounter\\".$element.".txt";
  $counter = 1;

  if(file_exists($filename))
  {
    //counter holen und inkrementieren
    $file = fopen($filename,"r");
    $counter = fgets($file);
    $counter++;
    fclose($file);
  }

  //datei ggfs. leeren und neuen counter schreiben
  $file = fopen($filename,"w");
  fwrite($file,$counter);
  fclose($file)
问题编辑: 好吧,那。。。是这个吗?
我增加了警报测试;以确保每次单击链接时都执行该函数。现在它起作用了。每次单击链接,计数器都会递增。但现在每次警报出现时。当我删除这一行时,它不再工作。有人明白吗?

单击超链接时,浏览器的默认行为是跟随该超链接到新页面。因此,您的ajax无法完成请求。要修复它,您需要防止默认行为。这将实现以下目的:

<p><a class="incCounter" onclick="incCounter('TL1');" href="#">Dies ist Testlink1</a></p>
<p><a class="incCounter" onclick="incCounter('TL2','index.html');" href="#">Dies ist Testlink2</a></p>
JS:


如您所见,您可以将第二个参数传递给函数,该函数将在发送ajax后浏览到另一个网站或页面。这是可选的。

这是因为您正在单击一个链接,并且没有阻止使用Javascript跟踪链接的默认行为。该警报防止它暂时允许ajax执行其工作。您需要向超链接添加事件处理程序,并将event.preventDefault;例如,您将一个id添加到。。然后在Javascript中执行以下操作:document.getElementByIdlink1.addEventListenerclick,functionevent{event.preventDefault;};啊好的。非常感谢。我不知道。我正在考虑阻止默认行为,将javascript上链接的href属性传递到我的ajax文件,然后转发到带有headerLocation的页面:。。。;但我真的不确定这是否是一种好的做法。有没有更聪明的方法来实现这一点?不,您不应该使用标题“Location:…”;为了这个。Ajax阻止访问者访问实际的PHP文件。因此,使用PHP重定向将不起作用。相反,在完成Ajax请求后,只需使用Javascript重定向访问者。不过,如果要直接重定向访问者,为什么要使用Ajax呢?你也可以让超链接直接指向PHP文件,然后从那里用PHP重定向访问者。当我使用window.location.href时,我的效果和以前一样。我必须添加这个来让它工作:xhr.onreadystatechange=function{ifxhr.readyState==4&&xhr.status==200{var result=xhr.responseText;ifurl!={window.location.href=url;}}}我刚刚从ajax文件返回true。非常感谢您快速而详细的帮助@K.O.先生,当然可以。对不起,那天我正计划去度周末,却忘了。不过很高兴你找到了答案:
<p><a class="incCounter" onclick="incCounter('TL1');" href="#">Dies ist Testlink1</a></p>
<p><a class="incCounter" onclick="incCounter('TL2','index.html');" href="#">Dies ist Testlink2</a></p>
/* Get the hyperlinks */
var counterLinks = document.getElementsByClassName('incCounter');

/* Add event listener to each hyperlink */
for (var i = 0; i < counterLinks.length; i++) {
    counterLinks[i].addEventListener("click", function(event){
        event.preventDefault();
    });
}

function incCounter(element, url = ''){    
    xhr = new XMLHttpRequest();
    xhr.open("GET","incCounter.php?e="+element,true);
    xhr.send();

    if(url != ''){
        window.location.href = url;
    }
}