PHP 按钮计数器问题


PHP Button Counter Issue

我对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. 如果单击该按钮几次,然后尝试使用"后退"按钮,则会引导您完成前面的每次单击。同样,有没有办法修复我的代码,以便它不这样做而是转到上一页?

非常感谢!!

按顺序:

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

  2. 同样,当您单击该按钮时,它将刷新页面并发布您的表单;因为您的脚本不会重定向,当您重新加载页面时,Firefox(以及其他浏览器(会要求您确认。

  3. 后退按钮行为实际上无法更改,但您可以强制浏览器从不缓存页面(搜索"禁用浏览器缓存 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);
    // 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);

让我们看看你在那里做什么。你有一个包含php的页面和一个自我提交的表单,实际上除了重新加载页面之外什么都不做。当页面重新加载时,$total计数器会因此递增,如果您"通过表单"或通过 brawser"重新加载页面,效果是相同的。Firefox 警报行为是由于 html 页面内存在表单,斗殴者要求您确认,因为刷新时所有输入数据都将丢失。正如我所说,每次点击都是页面重新加载,因此返回只会破坏多次刷新。

要解决所有这些问题,您应该考虑将javascript/jQuery与AJAX一起使用:

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

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

  • 单击事件 对计数器.php页面执行 AJAX get 调用并提醒请求响应(或准备一个具有唯一 ID 的跨度,以通过 jQuery 显示响应(。

是的,

您需要检查按钮是否被单击或页面被刷新。

将代码置于此条件下

<?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访问元素时很有帮助

干杯。

您可能希望使用 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 脚本(应该在不同的文件中(,并让它回显更新的计数。