THINKPHP 防止重复提交表单 自己动手制作
本方法适合用单个表单提交,通过TOKEN生成的随机数判断来完成的,如果我们一个页面中有多个表单的话我们就可以把TOKEN生成多个数组,例如:表单1提交成功销毁session('TOKEN[0]'), 表单2提交成功销毁session('TOKEN[1]'),这里我们就不写多表单提交的方法了,举一返三
首先在项目function.php 定义几个方法。
//创建TOKEN function creatToken() { $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)); session('TOKEN', authcode($code)); } //判断TOKEN function checkToken($token) { if ($token == session('TOKEN')) { session('TOKEN', NULL); return TRUE; } else { return FALSE; } } /* 加密TOKEN */ function authcode($str) { $key = "ANDIAMON"; $str = substr(md5($str), 8, 10); return md5($key . $str); }
在需要防止重复提交的表单form中加入相关代码
<form action="{:U()}" method="post" class="form-horizontal"> <input type="hidden" name="TOKEN" value="{:session('TOKEN')}"> ... </form>
1.在页面展示前调用creatToken()方法生成token。
2.在相应控制器POST请求中 使用 checkToken() 进行判断是否重复提交。
if(IS_POST){ //防止重复提交 如果重复提交跳转至相关页面 if (!checkToken($_POST['TOKEN'])) { $this->redirect('index/index'); return; } //下面相关业务代码 }else{ //创建token creatToken(); $this->display(); }