关于处理重复提交

evanhaha 2011-04-21 07:04:33
一个php页面,收到需要查询的字符串,怎么加入session或者memcache,来记录提交到服务器的时间,下次查询的时间也记录,时间差超过多少才能继续查询

一个简单的框架示意就行,拜托大家了!
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
evanhaha 2011-04-22
  • 打赏
  • 举报
回复
多谢两位大神!
lazyboy_wu 2011-04-22
  • 打赏
  • 举报
回复


<?php

// 链接memcache
$memcache = new Memcache;
$memcache->addServer($server_host, $server_port, $server_persistent);

$key = 'get_time';

$get_time = $memcache->get($key);

if(!empty($get_time) && time() - $get_time < 5) {
// 5秒内重复提交,报错返回
} else {
// 首次提交或5秒后提交,正常操作
$memcache->set($key, time());
}


evanhaha 2011-04-22
  • 打赏
  • 举报
回复
很感谢楼上,代码可用!请问memcache的写法是怎么样的?
evanhaha 2011-04-22
  • 打赏
  • 举报
回复
谢谢大家了!结贴晚了点,抱歉!
kaifadi 2011-04-22
  • 打赏
  • 举报
回复
如果只是判断选择分支语句这几条,根本不存在效率的区别!

关键是查询的SQL语句比较耗时,尤其是查找大数据量的情况下,Memcache肯定强过普通直接的SQL语句,它用内存缓冲数据来提升性能,这个速度,基本上就是直接从内存获取数据了,无需再经过数据库检索这个环节,唯一速度的阻挡就是带宽,而不是服务器自身了。所以它的速度不容置疑,前提要空间支持,如果服务器是自己的那一切都好说,如果是虚拟空间,未必一定支持Memcache!
kaifadi 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 falizixun2 的回复:]

根据1#的代码修改一下为:
//根据40条PHP代码优化的建议,用$_SERVER['REQUEST_TIME']代替time();
PHP code

<?php
header("content-type:text/html;charset=utf-8");
session_start();
if ((!!isset($_SESSION['cha'])) && (($_S……
[/Quote]
仔细看了一下1#的这种结构,感觉忽略了一种特殊情况,楼主可以试试,如果我不断执行刷新,那么$_SESSION['get_time']或$_SESSION['cha']将不断获得请求的新时间time(),这种情况如果也考虑在内,将让用户永远无法查询,即IF里的第一种情况一直都不会产生,再改一下为:

<?php
header("content-type:text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['cha']))
{
$_SESSION['cha']=$_SERVER['REQUEST_TIME']; //单独列出来if判断分支,如果SESSION不存在就给值,如果存在就不再重复给值,刷新也不会重新获得请求值!
echo $_SESSION['cha'];
}
if ((!!isset($_SESSION['cha'])) && (($_SERVER['REQUEST_TIME']-$_SESSION['cha']) >30))
{

// 如果session存在,并且请求时间大于SESSION保存时间差为30秒,也就是过30秒后再请求,就重新给SESSION赋值,并执行查找!
$_SESSION['cha'] = $_SERVER['REQUEST_TIME'];
//......
echo '这里是查找SQL的语句';
//输出该条语句仅测试使用!正常情况只有每30秒才能输出该条语句,而后跟上查找的SQL操作和数据返回!

}

?>

you will try it! I hope it can help you!
kaifadi 2011-04-22
  • 打赏
  • 举报
回复
根据1#的代码修改一下为:
//根据40条PHP代码优化的建议,用$_SERVER['REQUEST_TIME']代替time();

<?php
header("content-type:text/html;charset=utf-8");
session_start();
if ((!!isset($_SESSION['cha'])) && (($_SERVER['REQUEST_TIME']-$_SESSION['cha']) >30))
{

// 如果session存在,并且请求时间大于SESSION保存时间差为30秒,也就是过30秒后再请求,就重新给SESSION赋值,并执行查找!
$_SESSION['cha'] = $_SERVER['REQUEST_TIME'];
//......
echo '这里是查找SQL的语句';
//输出该条语句仅测试使用!正常情况只有每30秒才能输出该条语句,而后跟上查找的SQL操作和数据返回!
}
else
{
$_SESSION['cha']=$_SERVER['REQUEST_TIME'];
echo $_SESSION['cha'];
//如果session、COOKIE为空,即为第一次执行查找,把时间附加到session/cookie,并设置一个长时间!
}

?>


evanhaha 2011-04-22
  • 打赏
  • 举报
回复
最后请问这两个方式有什么不同么,牵扯到效率问题不?下午17点无人回答就结贴
guoerwei 2011-04-21
  • 打赏
  • 举报
回复
if (!empty($_SESSION['get_time']) && time() - $_SESSION['get_time'] < 5){
// 5秒内重复提交,报错返回
}else {
// 首次提交或5秒后提交,正常操作
$_SESSION['get_time'] = time();
}

21,890

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧