PHP-这是防止重新提交的好方法吗?

PHP-这是防止重新提交的好方法吗?,php,Php,这与预防有关,但这次的上下文是基于web的RPG。玩家击败怪物后,怪物会掉落一件物品。因此,我希望防止用户点击后退按钮,或保持刷新,以“复制”项目下降 由于项目删除很频繁,使用DB存储唯一的“删除事务id”对我来说似乎不可行。我有一个想法: 对于每次战斗,根据当前日期时间、用户id创建一个唯一值,并将其存储到数据库和会话中。有可能给定一个userid,您可以取回该值 如果数据库中存在来自会话的值,则“战斗”有效,并允许用户访问与战斗相关的所有页面。如果数据库中不存在,则会启动新的作战状态 战斗结

这与预防有关,但这次的上下文是基于web的RPG。玩家击败怪物后,怪物会掉落一件物品。因此,我希望防止用户点击后退按钮,或保持刷新,以“复制”项目下降

由于项目删除很频繁,使用DB存储唯一的“删除事务id”对我来说似乎不可行。我有一个想法:

  • 对于每次战斗,根据当前日期时间、用户id创建一个唯一值,并将其存储到数据库和会话中。有可能给定一个userid,您可以取回该值

  • 如果数据库中存在来自会话的值,则“战斗”有效,并允许用户访问与战斗相关的所有页面。如果数据库中不存在,则会启动新的作战状态

  • 战斗结束时,将从数据库中清除唯一值

  • 清除数据库中30分钟前的值


  • 欢迎对此方法的任何意见、改进或缺陷

    似乎是一种合理的方法。我想你在存储玩家在某处战斗的事实。否则,如果他们想避免打架,就可以关闭浏览器


    战斗结束和掉落战利品应被视为原子行动。如果没有战斗,就不会有任何掉落的战利品。

    这取决于你的游戏设计:你是否更倾向于只计算回合数的流氓,因此在移动之间长时间的停顿是绝对可能的(比如通过聊天室咨询其他人,注意:在NetHack中,这不被视为作弊)?用户只能在某些点或任何地方保存游戏吗?这在设计上产生了巨大的差异,例如,为类似Thorarin提到的开发让路


    如果你的游戏走的是传统的流氓路线,只有一个保存、回合地下室和permadeath,那么就有可能保存任何给定角色的当前回合数以及任何与游戏相关的信息(库存、地图、敌人及其状态),然后在玩家的任何动作中对照这些信息进行检查,因此,为了避免两次玩回合。

    或者,您可以将所有内容打包到客户端javascript中,这样即使他们重新提交表单,也会生成一个全新的战斗/宝藏遭遇战。

    这个问题非常主观,有些事情您可以做或不能做,取决于其周围已有的数据/框架

    您提供的解决方案应该可以工作,但这取决于您拥有的独特的战斗/战利品/用户数据

    我想这是你认为最好的?这是我认为最好的:)

  • 获取用户ID,以及来自该战斗的唯一数据。比如战斗开始时间,战斗结束时间等等
  • 将其存储在数据库中,或者您拥有的任何存储系统中
  • 收集战利品后,删除该记录
  • 这样,如果用户ID和唯一的战斗数据存在,他们就没有得到他们的战利品


    你是对的;跟踪每一件战利品太多了,最好暂时存储数据。

    。。。因此,当他们对第一卷中的劣质宝藏不满意时,让他们重播遭遇战。如果游戏主要是基于战斗的,那不会有什么区别,这取决于游戏的游戏方式。然后你会得到轻松的攻击。永远不要相信客户。