yii 验证码 CCaptcha的总结(转)

今天用到yii的验证码 ccaptcha,经过在网上搜寻 找到以下例子:

1、在controller中加入代码

(1)启用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?php

public function actions()

    {

        return array(

            // 启用验证码组件

            ‘captcha‘=>array(

                ‘class‘=>‘CCaptchaAction‘,

                ‘backColor‘=>0xFFFFFF,

                ‘maxLength‘=>4,       // 最多生成几个字符

                ‘minLength‘=>4,       // 最少生成几个字符

                ‘fixedVerifyCode‘ => substr(md5(time()),11,4), //每次都刷新验证码

            ),

        );

    }

?>

(2)添加进入规则


1

2

3

4

5

6

<?php

array(‘allow‘,

                ‘actions‘=>array(‘captcha‘),

                ‘users‘=>array(‘*‘),

            ),

?>

2、在model中加入代码

(1)声明


1

2

3

<?php

public $verifyCode;

?>

(2)加入属性


1

2

3

4

5

6

7

8

<?php

public function attributeLabels()

    {

        return array(

            ‘verifyCode‘=>‘Verification Code‘,

        );

    }

?>

(3)加入过滤规则


1

2

3

<?php

array(‘verifyCode‘‘captcha‘‘allowEmpty‘=>!extension_loaded(‘gd‘)),

?>

3、在view中写代码


1

2

3

4

5

6

7

8

9

10

11

12

<?php if(CCaptcha::checkRequirements()): ?>

    <div class="row">

        <?php echo $form->labelEx($model,‘verifyCode‘); ?>

        <div>

        <?php $this->widget(‘CCaptcha‘,array(‘showRefreshButton‘=>false,‘clickableImage‘=>true,‘imageOptions‘=>array(‘alt‘=>‘点击换图‘,‘title‘=>‘点击换图‘,‘style‘=>‘cursor:pointer‘))); ?>

        <?php echo $form->textField($model,‘verifyCode‘); ?>

        </div>

        <div class="hint">Please enter the letters as they are shown in the image above.

        <br/>Letters are not case-sensitive.</div>

        <?php echo $form->error($model,‘verifyCode‘); ?>

    </div>

    <?php endif; ?>

经过测试,老是报验证码错误,经过多方 查询

如果在 form中开启了,这两个

‘enableAjaxValidation‘=>true,
    ‘enableClientValidation‘=>true,

然后使用 ‘fixedVerifyCode‘ => substr(md5(time()),11,4),会导致这个问题发生,在这篇文章中,有详细描述为什么会出现这个问题的原因:http://blog.163.com/[email protected]/blog/static/10136328220133921313479/

使用fixedverifycode是为了解决验证码在Yii页面刷新的时候不变的问题,但是加入这个后 开启了ajax验证,就会老是出现验证码错误的情况。经过搜索,找到了一个简单解决yii页面刷新,验证码不变的方案:

$(document).ready(function(){

    var img = new Image;

        img.onload=function(){

            $(‘#yw0‘).trigger(‘click‘);

        }

        img.src = $(‘#yw0‘).attr(‘src‘);

});

经测试可以,原文地址:http://www.365joomla.com/php/yiishua-xin-ye-mian-yan-zheng-ma-bu-bian-chu-li-fang-fa

后又发现,如果form开启ajax验证,这时,如果输入错了一次验证码,再继续输入,不刷新验证码的话,就会一直出现验证码错误的情况。 一般情况是因为在设置CCaptchaAction参数时,设置了testLimit(相同验证码出现的次数。默认为3。小于等于0的值意味着不限制)为1,或则小于3,这种情况下,相同的验证码只能出现一次,而用户如果开启了ajax验证的话,填写的时候ajax验证一次已达到上限1次,提交的时候再验证一次,他会判断是否大于了testLimit的值,第二次验证testLimit会加1,显然大于了1,这时会重新生成验证码,从而出现验证码老是不正确

解决办法:
‘testLimit‘=>999,    //这里可以设置大一些,以免验证超过三次会出错.

原文地址:http://blog.163.com/[email protected]/blog/static/1013632822013230315743/

经过总结可以在form中开启  ‘enableAjaxValidation‘=>true,
    ‘enableClientValidation‘=>true, 并正常使用yii 验证码,需要以下设置:

controller:

return array(
            // captcha action renders the CAPTCHA image displayed on the contact page
            ‘captcha‘=>array(
                ‘class‘=>‘CCaptchaAction‘,
                ‘backColor‘=>0xFFFFFF,
                ‘maxLength‘=>4,       // 最多生成几个字符
                ‘minLength‘=>4,       // 最少生成几个字符
                ‘testLimit‘=>999,
           
            ),);

model:

public $verifyCode; //声明verifycode存储验证码

public function rules()
    {
        return array(
            // username and password are required
            array(‘username, password‘, ‘required‘),
            // rememberMe needs to be a boolean
            array(‘rememberMe‘, ‘boolean‘),
            // password needs to be authenticated
            array(‘password‘, ‘authenticate‘),
            // verifyCode needs to be entered correctly
            array(‘verifyCode‘, ‘captcha‘, ‘allowEmpty‘=>!CCaptcha::checkRequirements()), //添加此验证规则,这是是验证验证码是否一致的,不需要额外的代码就通过这条规则验  证即可
        );

views:

<?php $form=$this->beginWidget(‘bootstrap.widgets.BsActiveForm‘, array(
    ‘id‘=>‘login-form‘,
    ‘enableAjaxValidation‘=>true,
    ‘enableClientValidation‘=>true,
    ‘clientOptions‘=>array(
        ‘validateOnSubmit‘=>true,
    ),
)); ?>

<?php if(CCaptcha::checkRequirements()): ?>
    <div class="row">
        
            <div class="col-md-4"><?php echo $form->textField($model,‘verifyCode‘,array(‘placeholder‘=>‘输入验证码‘)); ?></div>
            <div class="col-md-6"><?php $this->widget(‘CCaptcha‘,array(‘showRefreshButton‘=>false,‘clickableImage‘=>true,‘imageOptions‘=>array(‘alt‘=>‘点击换图‘,‘title‘=>‘点击换图‘,‘style‘=>‘cursor:pointer;height:42px‘))); ?></div>
    <?php echo $form->error($model,‘verifyCode‘); ?>
        </div>     
    <?php endif; ?>

<?php $this->endWidget(); ?>

<script language="javascript">
$(document).ready(function(){
    var img = new Image;
        img.onload=function(){
            $(‘#yw0‘).trigger(‘click‘);
        }
        img.src = $(‘#yw0‘).attr(‘src‘);  //这段js解决yii验证码不刷新
});
</script>

时间: 2024-10-20 20:13:47

yii 验证码 CCaptcha的总结(转)的相关文章

Yii 验证码验证

控制器如下 LoginForm如下 视图如下 <div class="loginbody">            <span class="systemlogo"></span>             <div class="loginbox">                <ul>                    <?php $form = $this->beg

yii 验证码那点事儿

今天要使用yii验证码, 不过, 这个验证码是整站通用的, 也就是说, 有个表单的提交是使用ajax方式来提交, 整站, 不管在哪个地方, 都能点出来此窗口, 来提交信息 关于yii验证码, framework/web/widgets/captcha/CCaptcha.php里, 它源码里有这么一部分 >---protected function renderImage() >---{ >--->---if(!isset($this->imageOptions['id']))

yii 验证码的使用

在HappyController 中加入 public function actions(){ return array( // captcha action renders the CAPTCHA image displayed on the contact page 'captcha'=>array( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, //背景颜色 'minLength'=>4, //最短为4位 'maxLeng

关于 yii 验证码显示, 但点击不能刷新的处理

先说说 render 与 renderPartial, 各位看官, 先别走, 我没跑题, 这个问题如果需要解决, 关键就在 render 与 renderPartial 的区别. renderPartial() 方法 public string renderPartial(string $view, array $data=NULL, boolean $return=false, boolean $processOutput=false) $view string name of the vie

yii 验证码的使用和验证过程

如果要实现这个过程的话,需要几个步骤 第一步就是controller的操作 在要操作的控制器中添加如下代码: public function actions(){ return array( // captcha action renders the CAPTCHA image displayed on the contact page 'captcha'=>array( 'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF, 'maxLeng

yii验证码Captcha使用以及为什么验证码不刷新问题

Web开发的过程中, 经常会用到验证码, 以防止机器人不断的提交数据, 造成网站的瘫痪. Yii里提供了一个验证码的插件, 就是Captcha. 第一步: 在项目中使用Captcha需要以下一些设置:在Controller里添加方法 actions public function actions () { return array ( 'captcha' => array ( 'class' => 'CCaptchaAction' , 'minLength' => 1 , 'maxLen

yii 验证码功能的实现

首先知晓我们在使用验证码的时候通常是和我们的表单小部件配合使用首先我们创建model层 新建一个php文件 名字叫做Verifycode.php 要在我们的model层 创建我们的验证码的验证规则,我这里简单的写两个规则 一个是 非空 另一个是验证码必须验证正确 规则写在我们的model的rules里 <?php/*** Created by PhpStorm.* User: jinlei* Date: 2017/2/13* Time: 13:57*/ namespace frontend\mo

mydetails

1.yii验证码多余的get a new code ,即使在main.php中配置了中文也是出现获取新图片,影响效果 需要把 <?php $this->widget('CCaptcha'); ?> 改成 <?php $this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'点击换图','ti

YII模块中验证码无法加载进来

在YII的模块中,使用<?php $this->widget('CCaptcha'); ?>无法加载进来验证码. 解决的方法是<?php $this->widget('CCaptcha', array('captchaAction'=>'/controllerName/captcha')); ?> 在controller中需要设置 public function actions() { return array( 'captcha'=>array( 'cla