【问题标题】:PHP Button Counter IssuePHP 按钮计数器问题
【发布时间】:2012-05-10 06:34:44
【问题描述】:

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

非常感谢!!

【问题讨论】:

  • 在提交表单时,每次刷新页面时计数器都会增加

标签: php performance button reload counter


【解决方案1】:

按顺序:

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

【讨论】:

  • 太棒了!感谢您概述的反馈。一个问题,我到底应该把 header() 放在哪里
  • 嘿杰克——我在你指定的地方添加了 header(),但它似乎没有修复它。我也遇到了错误。你能举个例子说明它应该是什么样子吗?
  • 报错是否说“无法添加标头信息,标头已发送”?
  • 它说:警告:header() 需要至少 1 个参数,在第 8 行的 /home/phawre/public_html/new-php-testing/index.php 中给出 0
  • 这就是我所拥有的:
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    是的,

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

    将您的代码置于此条件下

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

    干杯。

    【讨论】:

    • 他仍然需要读取按钮被按下的次数。检查他的代码的结尾。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 2013-04-10
      • 1970-01-01
      • 2023-04-03
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多