xjdata 2015-09-03 16:12:06 2859次浏览 1条回复 0 0 0

大家好,提这个问题还是因为避免重复提交。

比如,yiichina 说说部分,假设 表中有字段,user_id,created_at,content 那么我们建立唯一规则时 一般情况下会进行 user_id,created_at联合唯一。 但是当某些情况下, 我们在点击发布的时候 如果按钮没有通过js进行限定或客户端禁用js,那么我在一个比较短的时间内(点击按钮到收到服务器响应进行跳转这段时间内)有多次进行点击了。或者在提交的时候 每个1秒点一次提交,一共点了10次。 经过个人测试,是会产生10条 逻辑上重复的数据的。 但是表内存储的内容确实是唯一的。

比如

user_idcreated_atcontent
1100内容
1101内容
1102内容
1103内容
1104内容
1105内容
1106内容
1107内容
1108内容
1109内容

这就出现了 逻辑上的重复数据了。

想到不行就联合验证3个字段的内容
[['user_id', 'created_at'], 'unique', 'targetAttribute' => ['user_id','created_at', 'content']],

于是问题是: 1.因为content 是varchar并且内容可能会比较多,那么yii在进行 unique 的时候会不会消耗比较大? 2.对于我说的这种情况,各位有什么好的办法吗? 3.在一个应用中 需要防止重复提交的地方应该是比较多的。如果通过php后台方式进行避免重复,难道每个action中都要进行相应代码的编写吗?那不一堆一堆的重复了?

欢迎大家指导,讨论,谢谢。

  • 回复于 2015-09-05 22:07 举报

    这个问题要分多种情况:
    1.宽松点的可以设置每个用户的连续发布时间间隔,比如2秒内同一用户只能发一次。
    2.严格一点,可以使用:用户id+content的前10个字符(也可以是固定几个位置的字符,比如10-20)+字符串长度进行md5.然后比对md5。这些都是有实效的,可以直接放在缓存里,设置一个10秒的缓存时间。
    3.最严格的话,就是用户ID+content全文md5之类,精确,但是消耗有点大。

    1 条回复
    回复于 2015-09-06 00:44 回复

    第二个办法非常适合解决我的需求,谢谢!

    觉得很赞
您需要登录后才可以回复。登录 | 立即注册