我对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.
计数器有效,但有三个问题我希望你们可以帮助我:
每次重新加载页面时计数器都会增加。我只希望单击按钮时计数器增加。有没有办法解决这个问题?
每次刷新页面时,Firefox都会要求我确认是否要重新加载页面。我知道我的浏览器设置中有一个选项来阻止这种情况,但是想知道是否有办法优化我的php,以便用户也不会发生此消息。
如果您多次单击该按钮,然后尝试使用“后退”按钮,则会指导您完成之前的每次点击。同样,有没有办法修复我的代码,以便它不会这样做,而是转到上一页?
非常感谢!!
答案 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)
按顺序:
发出POST请求时会增加计数器;问题是您的脚本在处理完POST后没有进行重定向。只需一个简单的header()
重定向即可。这将在GET中转换下一个请求并瞧!
再次,当您点击按钮后,它会刷新页面并发布您的表单;因为您的脚本没有重定向,当您重新加载页面时,Firefox(以及其他浏览器)也会要求您进行确认。
后退按钮行为无法真正改变,但您可以强制浏览器永远不会缓存页面(搜索“禁用浏览器缓存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);
答案 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脚本(应该在不同的文件中)并让它回显更新的计数。