php 如何避免程序重复执行
大家讲道理
大家讲道理 2017-04-10 17:51:22
[PHP讨论组]

如往数据库 中插入一条数据成功后跳转到下一个页面后 然后返回 又插入了一条 怎么避免

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(6)
PHP中文网
//表单页面
<?php 
   session_start();
   $token = md5(uniqid());  //生成一个随机token, 直接用php的函数, 也可以自己另外实现
   $_SESSION['token'] = $token;
?>
<form>
    <input type="hidden" value="<?php echo $token; ?>"
    //code
</form>


//提交页面
session_start();
if (!isset($_SESSION['token']) || $_POST['token'] != $_SESSION['token']) {
    die('重复提交');
}
unset($_SESSION['token']);

//code..
大家讲道理

那就在你的POST表单里加个一次性“凭证”呗,凭证由生成表单页面的逻辑签发,存入缓存;然后在接受POST的逻辑里检查凭证的有效性,有效则执行保存写入数据库,并清理掉这个凭证;
1.第一次请求,凭证未超时且有效,通过。
2.返回请求地址,实际是POST了一模一样的数据过去,但凭证已经被第一次清理,会检测到凭证失效。
3.多次被模拟(恶意)POST请求,凭证为前后关联,且具有时效性和一次性特点,也不会执行保存数据。

试试看,苦海无边,望君保重 - -!

黄舟

添加一个时间戳凭证,读取后比对当前时间,多少秒内不反复入库。

伊谢尔伦

设置一个global flag(true /false) ,然后用if 来判定这个flag 再插入。

大家讲道理

或者提交后禁止返回

伊谢尔伦

表单每次生成一个唯一且变化的token,同时生成对应的session,然后提交的时候,校验这个token。当插入数据库成功后,就清空这个session。即使重复点击,token也失效了!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号