PHP按钮计数器问题

时间:2012-05-10 06:34:45

标签: php performance button reload counter

我对PHP很新,但设法创建了一个脚本,只显示每次用户点击按钮时点击按钮的次数。
这是PHP:

<?php
$f = fopen('counter.txt', 'r+');
flock($f, LOCK_EX);
$total = (int) fread($f, max(1, filesize('counter.txt')));
if (isset($_POST['submit'])) {
rewind($f);
fwrite($f, ++$total);
}
fclose($f);
?>

这是HTML:

<form action='' method="post">
<input type="submit" name="submit" value="click" />
</form>
This button has been clicked <?php echo $total; ?> times.

计数器有效,但有三个问题我希望你们可以帮助我:

  1. 每次重新加载页面时计数器都会增加。我只希望单击按钮时计数器增加。有没有办法解决这个问题?

  2. 每次刷新页面时,Firefox都会要求我确认是否要重新加载页面。我知道我的浏览器设置中有一个选项来阻止这种情况,但是想知道是否有办法优化我的php,以便用户也不会发生此消息。

  3. 如果您多次单击该按钮,然后尝试使用“后退”按钮,则会指导您完成之前的每次点击。同样,有没有办法修复我的代码,以便它不会这样做,而是转到上一页?

  4. 非常感谢!!

4 个答案:

答案 0 :(得分:1)

让我们看看你在那里做了什么。你有一个带有php的页面和一个自我提交的表单,实际上除了重新加载页面之外什么都不做。重新加载页面时,$ total计数器会递增,如果您“通过表单”或通过brawser重新加载页面,它不会满足,效果是相同的。 Firefox警报行为是由于html页面中存在表单,争吵者会询问您的确认,因为刷新时所有输入数据都将丢失。 正如我所说,每次点击都是一次页面重新加载,因此返回时只会激活多次刷新。

要解决所有这些问题,您应该考虑在AJAX中使用javascript / jQuery:

  • 将$ total计数器处理放在一个单独的页面中,如counter.php

  • 设置一个没有表单的按钮来包装它并给它一个唯一的ID然后使用jQuery将它绑定到click事件

  • 点击事件的
  • 执行对counter.php页面的AJAX get调用并提醒请求响应(或准备一个具有唯一ID的span,通过jQuery显示响应)。

答案 1 :(得分:1)

按顺序:

  1. 发出POST请求时会增加计数器;问题是您的脚本在处理完POST后没有进行重定向。只需一个简单的header()重定向即可。这将在GET中转换下一个请求并瞧!

  2. 再次,当您点击按钮后,它会刷新页面并发布您的表单;因为您的脚本没有重定向,当您重新加载页面时,Firefox(以及其他浏览器)也会要求您进行确认。

  3. 后退按钮行为无法真正改变,但您可以强制浏览器永远不会缓存页面(搜索“禁用浏览器缓存php”以查看您必须提供的标题)。


  4. $f = fopen('counter.txt', 'r+');
    flock($f, LOCK_EX);
    $total = (int) fread($f, max(1, filesize('counter.txt')));
    if (isset($_POST['submit'])) {
        rewind($f);
        fwrite($f, ++$total);
        // when we're done increasing the counter
        // you will lose the POST data once the page refreshes
        // so remember to do whatever else you need to do here
        header('Location: ' . $_SERVER['REQUEST_URI']);
        exit;
    }
    fclose($f);
    

答案 2 :(得分:0)

是,

您需要进行检查,无论是点击了按钮还是刷新了页面。

将您的代码置于此条件下

<?php

if(isset($_POST['submit']){
   $f = fopen('counter.txt', 'r+');
   flock($f, LOCK_EX);
   $total = (int) fread($f, max(1, filesize('counter.txt')));
   if (isset($_POST['submit'])) {
      rewind($f);
      fwrite($f, ++$total);
   }
   fclose($f);
}
?>

另外,尝试使用提交按钮的其他名称。而不是name="submit"尝试,name="doPost" ..在通过javascript访问元素时很有帮助

干杯。

答案 3 :(得分:0)

您可能希望使用jQuery来研究基于AJAX的解决方案。这是一个如何工作(未经测试)的草图。将其添加到HTML标题中:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
function call_form() { 
  $.ajax({
    type: 'GET',
    url: PATH TO YOUR PHP SCRIPT,
    success: update_text
  });
};

function update_text(data) { 
   $('#counter').html(data);
};
</script>

并将其放入您的文档正文中:

//Put some PHP code here to fetch the count at page load and put that in $initial_count
<div>
<button type="button" value="Increment counter" id="counter" onClick="call_form();" /> 
</div>

<div>
This button has been clicked 
<span id="counter"><?php echo $initial_count; ?></span> 
times.
</div>

现在您需要做的就是更新存储新点击的PHP脚本(应该在不同的文件中)并让它回显更新的计数。