2012-05-08 20 views
2

ここでは、codeIgniterとReCaptchaを使用すると変な動作が発生します。ReCaptchaが無効です+ CodeIgniterフォームヘルパー=フォームデータが失われました

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> 

これがなぜ起こるか任意のアイデアですか?

+0

これを設定reCAPTCHAのバージョン1.11あなたを投稿する必要があります – Simmoniz

+0

表示+コントローラのフォームは、何が起こっているかを確認する – Laurence

+0

確かに。私は質問にコードを追加しました。ありがとう – Simmoniz

答えて

2

フォームを再投入するには、でなければなりません。form_validationコマンドを実行します。

しかし、あなたの問題では、reCaptchaが失敗した場合、検証は実行されないため、フォームには何も記入する必要はありません。

コードを変更して、フォームの検証を最初に実行してください。フォームの検証によってtrueが返された場合は、captchaをチェックします。

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'), 
+0

これは最終的にバグではなく、コード14:Pです。もちろん、captchaが有効でない場合、検証は実行されません。私はまた、私のform_validationの一環としてrecaptcha検証を追加しました。あなたの明確な答えをLaurenceiありがとう! – Simmoniz

+0

レコードの場合、コールバックの例では 'recaptcha_get_answer'の呼び出しは間違っています - ' $ str'は最後のパラメータでなければなりません。これはユーザの入力であるため、プライベートキーを最初のパラメータとして使用してください。それはその後完璧に動作します!あなたのビューでcaptchaに関連するエラーメッセージにアクセスするには、 'form_error( 'recaptcha_response_field');'を使用してください。 – neemzy

関連する問題