Yii输入正确验证码却验证失败的解决方法

前言

最近在做一个需求时,发现输入正确验证码,但是都提示验证码错误

最后追踪代码发现,如果 Model 在 save 前,单独做了 validate 验证,则在验证结束后,会重新生成验证码

然后在我们 Model save 时,也会进行 validate 验证,验证时,验证码已经重新生成了,所以会匹配不上

// 如果这里用到了验证码,就会出问题 $model = new Test(); $model->validate(); $model->save(); // 这样是正确的 $model = new Test(); // 把需要验证的 attribute 放进去,排除验证码字段 $model->validate(array('test1','test2')); $model->save()

我们可以看framework/web/widgets/captcha/CCaptchaAction.php 可以很容易就发现问题了

<?php class CaptchaAction extends CCaptchaAction { public function validate($input, $caseSensitive) { $code = $this->getVerifyCode(); $valid = $caseSensitive ? ($input === $code) : !strcasecmp($input, $code); $session = Yii::app()->session; $session->open(); $name = $this->getSessionKey() . 'count'; if (!Yii::app()->request->isAjaxRequest) { $session[$name] = $session[$name] + 1; } // 这里会重新生成 if ($session[$name] > $this->testLimit && $this->testLimit > 0) { $this->getVerifyCode(true); } return $valid; } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

时间: 2024-11-05 21:56:52

Yii输入正确验证码却验证失败的解决方法的相关文章

Fedora 16用root账户登录时提示验证失败的解决方法

环境:Fedora Linux 16 问题描述:Fedora linux16 用root用户登录 ,输入密码出现验证失败,即使你的密码是正确的,也会出现这种情况,这是因 为Fedora linux 默认禁止了root 超级用户. 解决办法: 最开始 尝试利用修复模式修改root用户密码,但是重启后仍然不奏效. 现在通过以下 修改: 进入修复模式,输入以下命令修改: 1.输入命令:vi /etc/pam.d/gdm,在文本编辑器中(输入i才能进入编辑模式)注释掉"auth required pam

ThinkPHP自动验证失败的解决方法

复制代码 代码如下: /* * 登陆 */ public function Login(){ if($_POST['submit']){ $DB = D('Login');//自定义Model处理 //if里面就是ThinkPHP的自动验证了. if(!$DB->create()){ $this->redirect('Index/Login', '', 3, '错误信息: '.$DB->getError().'<br/>系统将于3秒后返回重新登陆...'); }else{ $

ThinkPHP自动验证失败及解决方法

 /*  * 登陆  */ public function Login(){ if($_POST['submit']){ $DB = D('Login');//自定义Model处理     //if里面就是ThinkPHP的自动验证了. if(!$DB->create()){ $this->redirect('Index/Login', '', 3, '错误信息: '.$DB->getError().'<br/>系统将于3秒后返回重新登陆...'); }else{ $con[

ThinkPHP自动验证失败的解决方法_php技巧

复制代码 代码如下: /* * 登陆 */ public function Login(){ if($_POST['submit']){ $DB = D('Login');//自定义Model处理 //if里面就是ThinkPHP的自动验证了. if(!$DB->create()){ $this->redirect('Index/Login', '', 3, '错误信息: '.$DB->getError().'<br/>系统将于3秒后返回重新登陆...'); }else{ $

SQL Server 2008 R2登录失败的解决方法

为大家分享SQL Server 2008 R2登录失败的解决方法 1.启动SQL Server 2008 Management Studio,会看到 2.里面有一个 身份验证.这个 身份验证 的下拉列表里面有两个选项: Windows 身份验证 和 SQL Server 身份验证. 它们有什么区别: Windows 身份验证是指:你可以使用你电脑Windows系统的用户名和密码进行登入.如果你的电脑没有设置密码,那么就不需要输入用户名和密码,直接点击连接就可以登入. 我们一般使用第二种身份验证:

win8系统自动更新失败的解决方法

  win8系统自动更新失败的解决方法         首先以管理员身份打开命令提示符,输入命令DISM.exe /Online /Cleanup-image /Scanhealth并回车. 接着输入DISM.exe /Online /Cleanup-image /Restorehealth回车,等待修复完成重新启动电脑即可. 以下错误代码都是自动更新错误的代码 0x80070002 0x8007000D 0x800F081F 0x80073712 0x800736CC 0x800705B9 0

thinkphp验证码显示不出来的解决方法

 这篇文章主要介绍了thinkphp验证码显示不出来的解决方法,需要的朋友可以参考下 php的配置文件php.ini,搜索extension=php_gd2.dll,去掉前面的分号即可:   1.在模块类中增加一个 verify 方法来用于显示验证码    代码如下: Public function verify(){     // 导入Image类库     import("ORG.Util.Image");     Image::buildImageVerify(); }    

windows7操作系统启动ISC服务失败的解决方法

  windows7操作系统启动ISC服务失败的解决方法            具体解决方法: 1.首先打开Win7系统的运行对话框,然后输入services.msc,回车打开服务; 2.然后找到并将"Network Connections"设置为"手动"并启动; 3.然后再将"Windows Firewall/Internet Connection Sharing (ICS)"服务启用就可以了.

windows7/8升级win10卡在32%造成升级失败的解决方法

  随着win正式版发布了有两个多月了,很多用户都抢先升级到了win10系统,直接从win7.win8系统升级到win10系统的用户不在少数,不过有部分用户反映在升级win10的过程中出现卡在32%时,就安装失败了,对于出现该问题是什么原因造成的?我们应该如何解决呢?下面看小编为大家带来的解决方法! windows7/8升级win10卡在32%造成升级失败的解决方法 1.在开始安装程序之前,拔出任何已连接USB设备,包括外接显示器等. 2.检测当前设备所有硬件是否支持Win10系统,可通过硬件厂