1

我对 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 回答 4

1

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

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

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

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

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

于 2012-05-10T06:54:53.623 回答
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);
于 2012-05-10T06:56:46.493 回答
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 访问元素时很有帮助

干杯。

于 2012-05-10T06:55:58.273 回答
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 脚本来存储新的点击(应该在不同的文件中)并让它回显更新后的计数。

于 2012-05-10T07:05:55.893 回答