LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2036|回复: 7

求助:PHP数据库计数器怎么防刷新?

[复制链接]
发表于 2006-9-26 16:05:07 | 显示全部楼层 |阅读模式
想用session,请问具体代码!下面的是不能防刷新的代码。
<?php
mysql_connect("localhost","root","");
$query="select * from counter";
$result=mysql_db_query("counter",$query);
if($result){
$r=mysql_fetch_array($result);
$counter=$r["count"];
$counter=$counter+1;
echo "来访人数:".$counter;
$query="update counter set count='$counter' where id=1";
$result=mysql_db_query("counter",$query);
mysql_close();
}
?>
发表于 2006-9-27 09:18:13 | 显示全部楼层
用cookie
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-27 09:27:41 | 显示全部楼层
能给具体代码吗,我是新手!大侠!
回复 支持 反对

使用道具 举报

发表于 2006-9-28 12:34:30 | 显示全部楼层
使用 SESSION,参考资料:


  在进行数据处理和保存前,首先判断浏览器的获得页面方式。使用$_SERVER
["REQUEST_METHOD"]变量来获得浏览器的获得页面方式。检查其是否为”POST”。在
脚本中使用session来记录用户是否通过正常途径(即填写提交内容的页面)来提
交数据。或使用$_SERVER["HTTP_REFERER"]来检测,但不推荐这样做。因为部分浏
览器没有设置REFERER,有部分防火墙也会屏蔽REFERER。另外,我们也要对提交内
容检查,看数据库中是否有重复内容。以留言本为例,使用Session进行判定:
填写浏览内容的页面中,我们在最前端加上:

$_SESSION["allowgbookpost"]=time(); //登记填写时的时间


  在接受留言数据并保存的页面中我们在进行数据处理前我们也用Session进行
以下处理:

if(strtoupper($_SERVER["REQUEST_METHOD"])!=”POST”){ die("错误:请勿在外
部提交。"); } //检查页面获得方法是否为POST
if(!isset($_SESSION["allowgbookpost"]) or
(time()-$_SESSION["allowgbookpost"] < 10)){ die("错误:请勿在外部提交。
"); } //检查留言填写时的时间
if(isset($_SESSION["gbookposttime"]) and
(time()-$_SESSION["gbookposttime"] < 120)){ die("错误:两次提交留言的间
隔不得少于 2 分钟。"); } //检查留言间隔

unset($_SESSION["allowgbookpost"]); //注销allowgbookpost变量以防止一次进
入填写页面多次进行提交
$_SESSION["gbookposttime"]=time(); //登记发送留言的时间,防止灌水或恶意攻击
...
数据处理及保存
...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-28 16:05:12 | 显示全部楼层
版主,下面是我的程序,能给我加点session代码吗!我是菜鸟啊!
<html>
<head>
<title></title>
</head>
<body>
<?php
$connect=mysql_connect("localhost","root","");
mysql_select_db("counter",$connect);
$query="select * from counter";
$result=mysql_query($query);
if($result)
{
$r=mysql_fetch_array($result);
$counter=$r["count"];
$counter=$counter+1;
echo "来访人数:".$counter;
}
$query="update counter set count='$counter' where id=1";
$result=mysql_db_query("counter",$query);
mysql_close($connect);
?>
</body>
</html>
回复 支持 反对

使用道具 举报

发表于 2006-9-28 23:45:42 | 显示全部楼层
[php]

<?php
session_start();

$allow_insert = false;
if (!isset($_SESSION['c_time']))  //  如果第一次访问,设定时间戳,并允许增加
{
    $_SESSION['c_time'] = time();
    $allow_insert = true;
}
elseif (time() - $_SESSION['ctime'] < 160) // 如果在两分中内刷新页面,则不增加。按此可以设置永远不增加
{
    $allow_insert = false;

} else {                        // 如果超过两分钟,则重新计时,并允许增加
    $allow_insert = true;
    unset($_SESSION['ctime']);
}

?>
<html>
<head>
<title></title>
</head>
<body>
<?php
$connect=mysql_connect("localhost","root","");
mysql_select_db("counter",$connect);
$query="select * from counter";
$result=mysql_query($query);
if($result)
{
$r=mysql_fetch_array($result);
$counter=$r["count"];
if (false !== $allow_insert)   // 加入验证
{
    $counter=$counter+1;
}
echo "来访人数:".$counter;
}
$query="update counter set count='$counter' where id=1";
$result=mysql_db_query("counter",$query);
mysql_close($connect);
?>
</body>
</html>


[/php]


稍稍动了一个小脑筋,不过我没有在机子上测试过。
回复 支持 反对

使用道具 举报

发表于 2006-10-13 21:53:33 | 显示全部楼层
光是这样还不行的,因为session的id一般是cookie,少数是querystring,而这里的cookie是无生命期的,也就是说,在浏览器打开的时候,cookie一直可用,那么相对而言,服务器端的session也就是唯一的,但一旦把浏览器关掉,cookie随之灭失,尽管在服务器端session仍然存活,但是新打开的页面已经不会再使用原来的session,这种情况下,原来记录的session便是无效的。依照amdk6的方法,应该再加入不过期的cookie的语句,让他作为session的id,否则关闭页面重开就over了。但是如果客户端的人有心,他同样可以使用清除cookie的方法躲开这个问题。

我的建议是记录IP,判断这个IP在多少时间内(比如24小时内)是否访问过,如果是,就忽略,否则就记录他。当然,如果adsl用户采用不停地拨号,断开ppoe这样的方法,那我就没辙了
回复 支持 反对

使用道具 举报

发表于 2006-10-14 08:01:35 | 显示全部楼层
Post by quhan
光是这样还不行的,因为session的id一般是cookie,少数是querystring,而这里的cookie是无生命期的,也就是说,在浏览器打开的时候,cookie一直可用,那么相对而言,服务器端的session也就是唯一的,但一旦把浏览器关掉,cookie随之灭失,尽管在服务器端session仍然存活,但是新打开的页面已经不会再使用原来的session,这种情况下,原来记录的session便是无效的。依照amdk6的方法,应该再加入不过期的cookie的语句,让他作为session的id,否则关闭页面重开就over了。但是如果客户端的人有心,他同样可以使用清除cookie的方法躲开这个问题。

我的建议是记录IP,判断这个IP在多少时间内(比如24小时内)是否访问过,如果是,就忽略,否则就记录他。当然,如果adsl用户采用不停地拨号,断开ppoe这样的方法,那我就没辙了


兄弟说的非常有道理,赞一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表