在做一個(gè)需求時(shí),發(fā)現(xiàn)輸入正確驗(yàn)證碼,但是都提示驗(yàn)證碼錯(cuò)誤。
最后追蹤代碼發(fā)現(xiàn),如果 Model 在?save?前,單獨(dú)做了?validate?驗(yàn)證,則在驗(yàn)證結(jié)束后,會(huì)重新生成驗(yàn)證碼。然后在我們 Model?save?時(shí),也會(huì)進(jìn)行?validate?驗(yàn)證,驗(yàn)證時(shí),驗(yàn)證碼已經(jīng)重新生成了,所以會(huì)匹配不上。
問題發(fā)現(xiàn):
我們可以看framework/web/widgets/captcha/CCaptchaAction.php可以很容易就發(fā)現(xiàn)問題了。
<?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; ????????}???????? ????????//?這里會(huì)重新生成 ????????if?($session[$name]?>?$this->testLimit?&&?$this->testLimit?>?0)?{ ????????????????????$this->getVerifyCode(true); ????????} ????????????????return?$valid; ????} }
//?如果這里用到了驗(yàn)證碼,就會(huì)出問題$model?=?new?Test(); $model->validate(); $model->save();
//?這樣是正確的$model?=?new??Test(); //?把需要驗(yàn)證的?Attribute?放進(jìn)去,排除驗(yàn)證碼字段 $model->validate(array('test1','test2')); $model->save()
相關(guān)文章教程推薦:yii教程
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END