zend_captcha总是失败isValid()

时间:2009-12-13 11:34:33

标签: php zend-framework captcha

我遇到问题Zend_Captcha在提交页面并调用验证码的isValid()方法时始终返回false。这是我的坚果,因为就我而言,这应该有效。

我首先在控制器的动作功能顶部声明这个

$captcha = new Zend_Captcha_Image('captcha',
    array(
        'captcha' => array(
            'name' => 'graduatesignupcaptcha',
            'wordlen' => 6,     
            'font' => $this->config->captcha->font,
            'imgDir' => $baseUrl.'/images/captcha/',
            'imgUrl' => $this->config->webserver->name.'/images/captcha/',
        )
    )
);
$captcha->setHeight(80)
        ->setTimeout(300);

我通常会进行表单验证并且一切正常,但是当我来验证为验证码输入的值时,它总是返回false。

//next we check the captcha text to ensure that the form is a person not a script    
$captchaText = $form->getElement('captchainput')->getValue();
$captchaId = $form->getElement('captchaid')->getValue();
//$captchaSession = new Zend_Session_Namespace('Zend_Form_Captcha_'.$captchaId);


$captchaArray = array(
 'id' => $captchaId,
 'input' => $captchaText     
);



if(!$captcha->isValid($captchaArray)){

 $log->log(implode(",",$captcha->getErrors()), Zend_Log::DEBUG); 

 $form->getElement('captchainput')->setErrors(array('messages' => 'Bad security code'));     
 $formFailed = true;
}

我已经检查以确保我在我的表单中获取并存储为隐藏元素的ID与正在生成的图像匹配,但无论我做什么,这总是会失败。

我在这里错过了一些简单的东西吗?或者有更好的方法来解决这个问题吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

这可能与会话有关 - 也许会话值未正确存储。检查$_SESSION中的内容 - 应该是:

  ["__ZF"]=>
   array(1) {
   ["Zend_Form_Captcha_ef828f68e467db99e8f358244ad6c667"]=>
     array(2) {
        ["ENNH"]=>
        int(1)
      ["ENT"]=>
        int(1260764250)
      }
    }
    ["Zend_Form_Captcha_ef828f68e467db99e8f358244ad6c667"]=>
    array(1) {
      ["word"]=>
      string(6) "fubara"
    }

请注意,在您的代码中,您可能会从新的验证码中获取$ captchaId,但可能是在会话中您仍然拥有旧验证码的ID。验证ID是否真正匹配。

如果你不这样做,检查你的会话是否正常,如果他们这样做可能是一些错误 - 向ZF问题跟踪器提交一个错误。

答案 1 :(得分:0)

它对我有用

Zend_Loader::loadClass('Zend_Session_Namespace');
$sessionNamespace = new Zend_Session_Namespace('cptc');



Zend_Loader::loadClass('Zend_Captcha_Image');
$captcha = new Zend_Captcha_Image();
$captchaArray = array(
        'id' => $sessionNamespace->code,
        'input' => $filter->filter($this->_request->getParam('captcha'))     
            );
     if ($captcha->isValid($captchaArray)) {
     //your action here
     }