2015-05-24 19:18:09 7097次浏览 2条回答 1 悬赏 100 金钱

大家好,测试了一天,实际收效甚微。
具体controller如下。

public function actionCreate() {
    $session = Yii::$app->session;
    $sessionKey = Yii::$app->user->id . '.issending';
    Yii::warning(isset($session[$sessionKey]));
    if (!isset($session[$sessionKey])) {
        $session[$sessionKey] = microtime();
        Yii::warning($session[$sessionKey]);
        $model = new book();
        $model->load(Yii::$app->request->post());
        if ($model->save()) {
            \Yii::$app->getSession()->setFlash('info', '新增完成');
        } else {
            \Yii::$app->getSession()->setFlash('error', '新增失败');
        }
    }
    unset($session[$sessionKey]);
    $this->redirect(['index']);
}

作用是来防止段时间内重复提交的。

但是在我在前台 快速双击 提交按钮后,依然会产生2(或实际点击次数)条一样的数据
日志文件中 因为 Yii::warning(isset($session[$sessionKey])); 查产生的内容 全部为false。

客户端的js屏蔽按钮,已经实现(本测试中取消了屏蔽用来模拟客户端屏蔽js的情况)。
model部分unique的规则也已实现。(本测试中取消了unique规则,模拟实际上确实容许重复的情况)
不知道大家是否有什么好的方法,来避免重复提交。

谢谢大家。

最佳答案

  • 性感的农民 发布于 2015-05-25 07:52 举报

    可能的原因是unset($session[$sessionKey]);在你的第二次POST请求到达之前就执行了,所以session机制不好使。如果在不用unique规则、不用table的key冲突、也不用js屏蔽button的前提下,想在服务器端避免重复insert,可以在book中重载ActiveRecord的beforeSave方法,在里面查重,根据情况返回true/false。

    1 条回复
    回复于 2015-05-25 12:03 回复

    是的。 呃。。。。 还是自己角度的原因,以前c/s,老是按以前的模式在考虑。 已经用unique解决了。 谢谢。

您需要登录后才可以回答。登录 | 立即注册
xjdata
CEO

xjdata

注册时间:2011-12-07
最后登录:2021-07-09
在线时长:112小时28分
  • 粉丝23
  • 金钱14169
  • 威望75
  • 积分16039

热门问题