【问题标题】:ReCaptcha not valid + CodeIgniter Form helper = form data lostReCaptcha 无效 + CodeIgniter 表单助手 = 表单数据丢失
【发布时间】:2012-05-08 21:12:47
【问题描述】:

当我使用 codeIgniter 和 ReCaptcha 时,这是一个奇怪的行为。

我将 ReCaptcha 用作简单的应用程序/帮助程序。我所做的唯一更改是将 API 重命名为“recaptcha_helper.php”并添加了

if(!defined('RECAPTCHA")){ 
   define('RECAPTCHA',true);
   [API code]
}

将数据发布到我的控制器时,结果是……不符合预期。

ReCaptcha valid / form valid = works fine!
ReCaptcha valid / form not valid = works fine!
ReCaptcha not valid / form valid = all form data lost
ReCaptcha not valid / form not valid = all form data lost + validation lost

我也像我制作的所有其他网站一样使用“set_value('input_name')”。直到今天,当我在一个表单中添加一个 recaptcha 时,它曾经像一个魅力一样发挥作用。

这里是控制器:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Register extends MY_Controller {


    var $form_rules = array(    
                        array(
                            'field' => 'user_first_name',
                            'label' => 'Prénom ',
                            'rules' => 'trim|required|max_lenght[50]|xss_clean'),
                        array(
                            'field' => 'user_last_name',
                            'label' => 'Nom ',
                            'rules' => 'trim|required|max_lenght[50]|xss_clean'),
                        array(
                            'field' => 'user_email',
                            'label' => 'Courriel ',
                            'rules' => 'trim|required|max_lenght[100]|valid_email|xss_clean'),
                        array(
                            'field' => 'user_email_confirm',
                            'label' => 'Confirmation du courriel ',
                            'rules' => 'trim|required|max_lenght[100]|matches[user_email]|xss_clean'));

    public function __construct(){
        parent::__construct();
    }
    public function register(){

        $this->load->library('form_validation');
        $this->form_validation->set_rules($this->form_rules);

        // RECAPTCHA STUFF
        $this->load->helper('recaptcha');
        $publickey = "****";
        $privatekey = "****";
        # the response from reCAPTCHA
        $resp = null;
        # the error code from reCAPTCHA, if any
        $error = null;

        if(isset($_POST) && count($_POST)>0){
            $resp = recaptcha_check_answer ($privatekey,
                                            $_SERVER["REMOTE_ADDR"],
                                            $_POST["recaptcha_challenge_field"],
                                            $_POST["recaptcha_response_field"]);
            if ($resp->is_valid) {
                if($this->form_validation->run()){
                    $new_data = array(  'user_first_name' => $_POST['user_first_name'],
                                        'user_last_name' => $_POST['user_last_name'],
                                        'user_email' => $_POST['user_email']);
                    $this->db->insert('user', $new_data);
                    $new_user_id = $this->db->insert_id();
                    $this->load->view('header');
                    $this->load->view('sent');
                    $this->load->view('footer');
                    return;
                }
            }else{
                 $error = $resp->error;
            }
            $data = $_POST;
        }

        $data['recaptcha'] = recaptcha_get_html($publickey, $error);

        $this->load->view('header');
        $this->load->view('inscription_form', $data);
        $this->load->view('footer');
    }
}

这是表格

<div id="inscription">        
    <?php echo form_open(); ?>
        <p>
            <label for="user_first_name">Pr&eacute;nom *</label>
            <input type="text" name="user_first_name" value="<?php echo set_value('user_first_name'); ?>" maxlength="50" />
            <?php echo form_error('user_first_name'); ?>
        </p>
        <p class="clear">
            <label for="user_last_name">Nom *</label>
            <input type="text" name="user_last_name" value="<?php echo set_value('user_last_name'); ?>" maxlength="50" />
            <?php echo form_error('user_last_name'); ?>
        </p>
        <p class="clear">
            <label for="user_email">Courriel *</label>
            <input type="text" name="user_email" value="<?php echo set_value('user_email'); ?>" maxlength="100" />
            <?php echo form_error('user_email'); ?>
        </p>
        <p class="clear">
            <label for="user_email_confirm">Confirmation du courriel *</label>
            <input type="text" name="user_email_confirm" value="<?php echo set_value('user_email_confirm'); ?>" maxlength="100" />
            <?php echo form_error('user_email_confirm'); ?>
       </p>
       <div class="clear"></div>
        <div><?php echo $recaptcha; ?></div>
        <p><input type="submit" value="Envoyer"/></p>
        <p class="clear">* Tous les champs de ce formulaire sont requis.</p>
    </form>
</div>

任何想法为什么会发生这种情况?

【问题讨论】:

  • 我也使用 ReCaptcha 1.11 版
  • 你需要发布你的视图+控制器表单来看看发生了什么
  • 当然。我在问题中添加了代码。谢谢

标签: forms validation codeigniter captcha recaptcha


【解决方案1】:

为了重新填充表单,您必须运行 form_validation 命令。

但您的问题是,在您的代码中,如果 reCaptcha 失败,您将永远不会运行验证,因此无需再次填写表单(因为它实际上从未进入验证)。

所以改变你的代码,并首先运行表单验证。如果表单验证返回 true,则检查验证码。

if(isset($_POST) && count($_POST)>0){
        $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);
         if($this->form_validation->run()) 
          {
            if ($resp->is_valid) 
            {
                $new_data = array(  'user_first_name' => $_POST['user_first_name'],
                                    'user_last_name' => $_POST['user_last_name'],
                                    'user_email' => $_POST['user_email']);
                $this->db->insert('user', $new_data);
                $new_user_id = $this->db->insert_id();
                $this->load->view('header');
                $this->load->view('sent');
                $this->load->view('footer');
                return;
            }
            else
            {
                  $error = $resp->error;
            }
        }
        $data = $_POST;
    }

一件事 - 改进你的代码 - 让你的 reCaptcha ($resp->is_valid) 改为一个回调方法 - 然后你可以实际运行验证码作为表单验证的一部分,而不是单独的方法。

See here for callbacks

public function _recaptcha_check($str)
    {
              $resp = recaptcha_check_answer ($str,
                                    $_SERVER["REMOTE_ADDR"],
                                    $_POST["recaptcha_challenge_field"],
                                    $_POST["recaptcha_response_field"]);
          if ( ! $resp->is_valid)
          {
            $this->form_validation->set_message('_recaptcha_check', 'Your reCaptcha was wrong!');
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

并在您设置规则的地方设置它(注意回调名称的双“_”)

array(
                            'field' => 'recaptcha_response_field',
                            'label' => 'Recaptcha',
                            'rules' => 'required|callback__recaptcha_check'),

【讨论】:

  • 这最终不是错误,而是代码 14 :P 当然,当验证码无效时,验证不会运行。我还添加了 recaptcha 验证作为我的 form_validation 的一部分。感谢 Laurencei 的明确回答!
  • 作为记录,回调示例中对recaptcha_get_answer的调用是错误的-$str应该是最后一个参数,因为它是用户输入,你应该继续使用你的私钥作为第一个参数。那就完美了!要在您的视图中访问与验证码相关的错误消息,只需使用form_error('recaptcha_response_field');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
相关资源
最近更新 更多