大家好,测试了一天,实际收效甚微。
具体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规则,模拟实际上确实容许重复的情况)
不知道大家是否有什么好的方法,来避免重复提交。
谢谢大家。
可能的原因是unset($session[$sessionKey]);
在你的第二次POST请求到达之前就执行了,所以session机制不好使。如果在不用unique规则、不用table的key冲突、也不用js屏蔽button的前提下,想在服务器端避免重复insert,可以在book中重载ActiveRecord的beforeSave方法,在里面查重,根据情况返回true/false。
表示我也遇到这中问题