Yii2提交按钮条件设置:禁止已提交表单的用户点击
解决Yii表单提交按钮的条件控制问题
嘿,刚接触Yii不用慌,我来帮你搞定这个表单提交按钮的条件控制问题~你的思路是对的,但代码里有几个小问题需要调整,我给你整理了正确的实现方式,分Yii2和Yii1两种情况(看你用的版本):
先纠正你代码里的几个问题
- 直接拼接用户ID到SQL语句里有SQL注入风险,一定要用参数绑定
- Yii里判断记录是否存在的方法写法不对,不管是Yii1还是Yii2,都不是
model()->exist('xxx='.$id)这种格式 - 视图里输出Html按钮的时候要确保正确调用方法并输出
Yii2 版本实现
如果你的项目是Yii2,用下面的代码就可以:
<div class="form-group"> <?php // 获取当前登录用户ID $userId = Yii::$app->user->getId(); // 安全判断用户是否已提交过表单(用参数绑定避免注入) $hasSubmitted = AsdaPa0026::find() ->where(['id_asda_pa_0025' => $userId]) ->exists(); if ($hasSubmitted) { // 已提交,显示提示文本 echo '<p class="text-warning">你已经提交过表单啦,无法再次提交</p>'; } else { // 未提交,显示正常的提交按钮 echo Html::submitButton('提交表单', ['class' => 'btn btn-primary']); } ?> </div>
可选优化:禁用按钮而非隐藏
如果你不想完全隐藏按钮,而是让按钮显示但不可点击,把else里的代码改成这样:
echo Html::submitButton('提交表单', [ 'class' => 'btn btn-primary', 'disabled' => true, 'title' => '你已经提交过表单啦' ]);
Yii1 版本实现
如果你的项目是Yii1(从你代码里的model()调用来看可能是),用这个版本:
<div class="form-group"> <?php // 获取当前登录用户ID $userId = Yii::app()->user->getId(); // Yii1里的安全判断方式 $hasSubmitted = AsdaPa0026::model()->exists( 'id_asda_pa_0025 = :userId', [':userId' => $userId] ); if ($hasSubmitted) { echo '<p class="text-warning">你已经提交过表单啦,无法再次提交</p>'; } else { echo CHtml::submitButton('提交表单', ['class' => 'btn btn-primary']); } ?> </div>
重要补充:后端也要加验证
前端的控制很容易被绕过(比如用户修改HTML代码),所以一定要在控制器的提交方法里再加一层验证,确保安全:
Yii2 控制器示例
public function actionCreate() { $model = new AsdaPa0026(); $userId = Yii::$app->user->getId(); // 后端验证:如果已提交过,直接跳转并提示 if (AsdaPa0026::find()->where(['id_asda_pa_0025' => $userId])->exists()) { Yii::$app->session->setFlash('error', '你已经提交过表单啦,不能重复提交'); return $this->redirect(['site/index']); // 跳转到合适的页面 } // 正常处理表单提交 if ($model->load(Yii::$app->request->post()) && $model->save()) { Yii::$app->session->setFlash('success', '表单提交成功'); return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); }
这样前端+后端双重控制,既保证了用户体验,又确保了数据安全~
内容的提问来源于stack exchange,提问作者KevG
相关产品推荐
相关产品推荐

