十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
PHP 防止表单重复提交,使用令牌来做验证,即可解决。示例如下:
创新互联公司基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业四川雅安服务器托管报价,主机托管价格性价比高,为金融证券行业服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
index.php:
?php
header("Content-type:text/html;charset=utf-8");
//开启session
session_start();
//如果令牌为空,则生成一个令牌
if(!isset($_SESSION['token'] ) || $_SESSION['token'] == ""){
//给当前表单生成一个令牌
$_SESSION['token'] = md5(microtime(true));
}
?
form method="get" action="deal.php"
名称: input type="text" name="names"br/
描述: input type="text" name="desc"br/
input type="text" name="token" value="?=$_SESSION['token']?"
input type="submit" value="提交"
/form
deal.php:
?php
header("Content-type:text/html;charset=utf-8");
//开启session
session_start();
//验证令牌
if($_REQUEST['token'] === $_SESSION['token']){
//表单已经提交,重新生成令牌
$_SESSION['token'] = md5(microtime(true));
echo "表单提交成功:br/";
print_r($_REQUEST);
}else{
echo "重复提交";
}
?
大致看了下,主要两个问题:
1)session_start(),代码里仅在没有提交且没有生成过session时才执行,这直接导致提交时$_SESSION未定义
2)隐藏值originator,value="?=$value?",$value从哪来的?应该是$code吧。但如果是$code,那必然又和$_SESSION['code']一致了
可以考虑以$_SESSION['code']是否存作为判断是否第一次提交的依据,示例代码如下:
----------------------------------------------------------
?php session_start(); ?
!-- 页面显示部分 --
html
form id="form2" name="form2" method="post" action=""
div align="left"请选择数据:
select name="select" id="select"
?php
$App = new AppInfo();
$appData=$App-appInfo;
foreach ($appData as $k=$v) {
echo 'option value="', $v['id'], '"', $v['name'], '/option';
}
?
/select
input type ="submit" value ="提交"/
/div
/form
input type="button" value="返回主页" onclick="location.href='/player/server/views/index.html'"
!-- 提交处理部分 --
?php
if( isset( $_POST['select'] ) ){
if( isset( $_SESSION['code'] ) ){
echo '请不要刷新页面或重复提交表单!';
}else{
$uss = new UserAction();
$uss-userSubmit($_POST['select']);
$_SESSION['code'] = TRUE;
}
}?
/html
在php中如何防止表单的重复提交
?php
/*
* php中如何防止表单的重复提交
*/
session_start();
if (empty($_SESSION['ip'])) {//第一次写入操作,判断是否记录了IP地址,以此知道是否要写入数据库
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; //第一次写入,为后面刷新或后退的判断做个铺垫
//...........//写入数据库操作
} else {//已经有第一次写入后的操作,也就不再写入数据库
echo '请不要再次刷新和后退'; //写一些已经写入的提示或其它东西
}
?
还有办法就是:
1、在页面生成随机码,也就是每次提交随机码都不一样,在提交的时候验证随机码!
2、在提交的时候,验证如果数据存在,就不提交了
最常用的方法就是利用token。即:
1、在生成页面的时候生成一个token(随机字符串),并把它同时写入表单的某个hidden中,和服务端的session中。
2、客户端提交表单到服务器时,比对表单中的token与session中的token是否一致。若不一致则认为是无效的请求。
3、不管第2步的校验是否通过,token只要使用一次后就立即作废(即:从session中销毁)。同时token也可以关联时间信息,超时后也自动作废。
这样,即便客户端重复提交,也只有第一次的请求能够成功。
你都已经会用token来做防提交了,用$_COOKIE来设定时间
提交成功,保存COOKIE
setcookie('lastposttime', time(), time()+86400*24);
然后判断发布时间
time() - $_COOKIE['lastposttime']) 60 (单位秒)
现在就不会重复提交了
可以采用ajax配合使用php可以防止刷新页面重复提交
也可以使用框架同样可以防止
你直接访问数据处理页面的时候,$_POST['title'],$_POST['num] 应该是空值,所以你增加一个判断,必须有具体的值,再进行sql操作。