Предупреждение unable to access an error message corresponding to your field name

I have a callback function that check_captcha which sees if $row is ==0 or == 1 (this information is queried from sql). The problem is that I can not call it from $self->form_validation->se...

I have a callback function that check_captcha which sees if $row is ==0 or == 1 (this information is queried from sql).

The problem is that I can not call it from $self->form_validation->set_rule('captcha', 'call_back_check_captcha') due to the fact that my function takes in a $row var. The way I’m calling it now I get a Unable to access error message. How can I make this work?

function check_captcha( $row)
{
    if($row ==0)//didnt find any
    {
        $this->form_validation->set_message('captcha', 'text dont match captcha');
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}


function create_member() 
        {   

            $past = time() - 7200; 

        $this->db->query("DELETE FROM captcha WHERE captcha_time <".$past);                 
        $sql = "SELECT COUNT(*) AS count FROM captcha WHERE word =? AND ip_address =?";     
        $binds = array($_POST['captcha'], $this->input->ip_address(), $past);
        $query= $this->db->query($sql, $binds);

        $row = $query->row(); //row query rows : if it found an entry =1 

            $self->check_captcha($row->count);

        //VALIDATIONS
        $this->form_validation->set_rules('first_name', 'First Name', 'trim|required');
        $this->form_validation->set_rules('last_name', 'Last Name', 'trim|required');      
        $this->form_validation->set_rules( 'email_address', 'Email Address', 'trim|required|valid_email|unique[user.email_address]');
        $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[4]|unique[user.username]');
        $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[4]|max_leng[32]');
        $this->form_validation->set_rules('password2', 'Password Confirmation','trim|required|matches[password]');
        if(!$_POST['captcha']){
        $this->form_validation->set_rules('captcha', 'Captcha','trim|required');}else{
        $this->form_validation->set_rules('captcha', 'Captcha', 'callback_check_captcha');}

        if($this->form_validation->run()==FALSE)
        {   //this -> to the curr obj(UserController) && registraion() points to the the function in controller
            $this->registration();  //reloads reg page so they can fill out right stuff
        }
        else

У меня есть проблема в моем коде. Я создаю простой логин, используя CI3 для моего небольшого проекта. Моя проблема в том, что у меня есть сообщение об ошибке при проверке обратного вызова.

Вот ошибка, которую я получаю всякий раз, когда пытаюсь проверить свою форму.

Unable to access an error message corresponding to your field name Password.(check_database)

Вот код mo в контроллере:

public function index() {

$this->form_validation->set_rules('username', 'Username', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database');

$this->form_validation->set_error_delimiters('<div class="error text-red">', '</div>');

if($this->form_validation->run() == FALSE) {

$data = array();
$data['modules'] = $this->flx_lib->moduler($data);
$this->load->view('login', $data);

} else {//ok
}

}

public function check_database($password) {

$username = $this->input->post($username);
$result = $this->flx_users->validate_user($username, $password);

if($result) {
//ok
return TRUE;
} else {
$this->form_validation->set_message('check_database', 'Invalid username or password');
return FALSE;
}

}

Вот мой взгляд:

<div class="form-group has-feedback <?php error_exists('username'); ?>">
<input type="text" class="form-control" name="username" placeholder="Username" />
<span class="fa fa-user form-control-feedback "></span>
<?php echo form_error('username'); ?>
</div>

<div class="form-group has-feedback <?php error_exists('password'); ?>">
<input type="password" class="form-control" name="password" placeholder="Password">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
<?php echo form_error('password'); ?>
</div>

ты можешь помочь мне с этим? Я использую CI3 с HMVC

0

Решение

Хорошо, я нашел ошибку в моем коде. На самом деле это проблема с проверкой формы HMVC.

Вот ссылка для правильного ответа:
CodeIgniter — Невозможно получить доступ к сообщению об ошибке, соответствующему имени вашего поля Пароль. (Pword_check)

Solution:

1. Create MY_Form_validation.php file in libraries folder and paste following code in it.

if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Form_validation extends CI_Form_validation
{

function run($module = '', $group = '')
{
(is_object($module)) AND $this->CI = &$module;
return parent::run($group);
}
}

And change if ($this->form_validation->run() == FALSE) to if ($this->form_validation->run($this) == FALSE) thats all folks..

0

Другие решения

public function index() {

$this->form_validation->set_rules('username', 'Username', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database',
array('check_database' => 'Invalid username or password.')
);

$this->form_validation->set_error_delimiters('<div class="error text-red">', '</div>');

if($this->form_validation->run() == FALSE) {

$data = array();
$data['modules'] = $this->flx_lib->moduler($data);
$this->load->view('login', $data);

} else {//ok
}

}

public function check_database($password) {

$username = $this->input->post($username);
$result = $this->flx_users->validate_user($username, $password);

if($result) {
//ok
return TRUE;
} else {
return FALSE;
}

}

Я перекодировал этот. Что-то было перепутано.
Это из документы:

$this->form_validation->set_rules('field_name', 'Field Label', 'rule1|rule2|rule3',
array('rule2' => 'Error Message on rule2 for this field_name')
);

0

Я пытаюсь добавить Google reCAPTCHA в мое приложение Codeigniter.

Но я продолжаю сталкиваться с этой проблемой: Unable to access an error message corresponding to your field name Captcha. (recaptcha) Unable to access an error message corresponding to your field name Captcha. (recaptcha)

Я пытаюсь отправить форму, чтобы выбросить ошибку, $server_output['success'] должен быть FALSE выполняя, таким образом, $this->form_validation->set_message('recaptcha', 'Please redo the {field}.'); но Codeigniter, похоже, вообще не выполняет функцию обратного вызова…

Валидация работает во всем остальном, поскольку ошибка выводится (в дополнение к сообщению об ошибке в заголовке):

The Username field is required. The Password field is required. The Password Confirmation field is required. The Email field is required.

Я выполняю проверку через мою модель (следуя соглашению о том, что контроллеры не подходят и моделируют жир):

public function __construct()
{
    parent::__construct();
    $this->load->library('form_validation');
}

public function register_validation()
{
    /*
     * INITIALIZE FORM VALIDATION RULES
     */
    $this->form_validation->set_rules('username', 'Username',
        array(
            // REMOVED FOR PRIVACY REASONS.
        )
    );
    $this->form_validation->set_rules('password', 'Password',
        array(
            // REMOVED FOR PRIVACY REASONS.
            )
    );
    $this->form_validation->set_rules('password_confirmation', 'Password Confirmation',
        array(
            // REMOVED FOR PRIVACY REASONS.
            )
    );
    $this->form_validation->set_rules('email', 'Email',
        array(
            // REMOVED FOR PRIVACY REASONS.
        )
    );

    /*
     * SET CUSTOM VERIFICATION RULES:
     * 1. GOOGLE RECAPTCHA WIDGET
     */
    $this->form_validation->set_rules('g-recaptcha-response', 'Captcha', 'callback_recaptcha');

    /*
     * CHANGE ERROR MESSAGES FOR SOME RULES.
     */
    $this->form_validation->set_message('is_unique', 'The {field} has already been taken!');

    /*
     * RUN VALIDATION,
     * IF VALIDATION IS NOT PASSED --> RETURN FALSE.
     */
    if ($this->form_validation->run() === FALSE)
        return FALSE;
    /*
     * ELSE WHEN EVERYTHING PASSES VALIDATION AND RECAPTCHA,
     * TRY TO CREATE NEW USER.
     */
    else
    {
        /*
         * TRY TO CREATE NEW USER.
         */
        if ($this->create_user())
        {
            /*
             * SET FLASHDATA TO ALERT USER THAT
             * THE ACCOUNT HAS BEEN SUCCESSFULLY CREATED.
             */
            $this->session->account_created = TRUE;
            $this->session->mark_as_flash('account_created');
            return TRUE;
        }
        else
        {
            /*
             * THROW ERROR AND ALERT USER VIA FLASHDATA.
             */
            $this->session->account_created = FALSE;
            $this->session->mark_as_flash('account_created');
            return FALSE;
        }
    }
}

Вот моя функция обратного вызова recaptcha в том же классе/модели:

/*
 * RECAPTCHA FUNCTION
 */
public function recaptcha($data = '')
{
    /*
     * INITIALIZE VARIABLES.
     */
    $google_api_url = 'https://www.google.com/recaptcha/api/siteverify';
    $google_secret_key = 'REMOVED FOR PRIVACY REASONS';
    $ip = $this->input->ip_address();
    $response = $data;

    /*
     * INITIALIZE CURL.
     */
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $google_api_url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS,
        http_build_query(array(
                'secret' => $google_secret_key,
                'response' => $response,
                'remoteip' => $ip,
            )
        )
    );
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    /*
     * RUN CURL.
     */
    $server_output = curl_exec($curl);
    curl_close($curl);
    $server_output = json_decode($server_output, true);

    /*
     * CHECK RECAPTCHA SUCCESS
     */
    if ($server_output['success'])
        return TRUE;
    else
    {
        $this->form_validation->set_message('recaptcha', 'Please redo the {field}.');
        return FALSE;
    }
}

Что я делаю не так? Это не работает, потому что я выполняю проверку в рамках модели? Застрял на этом в течение хороших 2-3 часов… Надеюсь, код читаем.

Благодаря ~

This is the example code return the validation error  message as «Unable to access an error message corresponding to your field name»:

function _article_valid() {
    $this->load->helper(array(‘form’, ‘url’));
    $this->load->library(‘form_validation’);
    $this->form_validation->set_rules(‘title’, ‘Title’, ‘required’);
    $this->form_validation->set_rules(‘url’, ‘Url’, ‘callback_url_check’);
    return $this->form_validation->run();
}    

function url_check($url){
    if ($url == ‘test’) {
        $this->form_validation->set_message(‘url’, ‘The field can not be the word «test»‘);
        return FALSE;
    }else{
        return TRUE;
    }  
}

And i found the problem is caused by the text in red with yellow background shown above.

Firstly, according example code shown at official site, that value same as the callback function name, and also same as function name after «callback_» rule prefix :

and then I change the first argument of set_message which’s same as the callback function name and found its work.

function url_check($url){
    if ($url == ‘test’) {
        $this->form_validation->set_message(‘url_check‘, ‘The field can not be the word «test»‘);
        return FALSE;
    }else{
        return TRUE;
    }  
}

of cos it’s work for this too:

function _article_valid() {
    $this->load->helper(array(‘form’, ‘url’));
    $this->load->library(‘form_validation’);
    $this->form_validation->set_rules(‘title’, ‘Title’, ‘required’);
    $this->form_validation->set_rules(‘pwd’, ‘pwd’, ‘callback_pwd_valid‘);
    return $this->form_validation->run();
}    

function pwd_valid($pwd){
    if ($pwd == ‘test’) {
        $this->form_validation->set_message(‘pwd_valid‘, ‘The field can not be the word «test»‘);
        return FALSE;
    }else{
        return TRUE;
    }  
}

And according the article by brianantonelli in brianistech.wordpress.com, you can also change the first argument of set_message function to __FUNCTION__ , also is a solution. (tested works in this articcase)

function url_check($url){
    if ($url == ‘test’) {
        $this->form_validation->set_message(__FUNCTION__, ‘The field can not be the word «test»‘);
        return FALSE;
    }else{
        return TRUE;
    }  

Reference:

http://www.codeigniter.com/userguide2/libraries/form_validation.html#callbacks 
https://brianistech.wordpress.com/2010/11/22/unable-to-access-an-error-message-corresponding-to-your-field-name/

Вопрос:

В настоящее время я использую codeIgniter 3. Я создал страницу регистрации с именем пользователя, паролем, подтверждением пароля и электронной почтой. Для сравнения двух строк я использовал функцию strcmp(). Теперь проблема заключается в том, что я помещаю что-то вроде

password = "moon";
confirmation_password = "moon";

Он работает без проблем. Логически вы скажете мне 🙂 В противном случае, когда я помещаю что-то вроде

password = "moon";
confirmation_password = "something else";

Теперь он по-прежнему работает, показывая мне соответствующее сообщение об ошибке. Логически снова вы скажете мне. За исключением того, что появляется другое сообщение об ошибке:

Unable to access an error message corresponding to your field name Password confirmation.(check_information)

Я не понимаю, как это сообщение об ошибке может появиться только тогда, когда переменная confirm_password не совпадает с переменной пароля. Здесь мой код

function index()
{
$this->form_validation->set_rules('confirmation_password', 'Password confirmation', 'trim|required|callback_check_information');
}

function check_information($confirmation_password)
{
$password = $this->input->post('password');
if (strcmp($password, $confirmation_password))
{
echo 'password and confirmation password doesn't match';
return FALSE;
}

}

Кто-нибудь может сказать, есть ли что-то не так в моем коде? Я добровольно показываю вам часть моего кода, чтобы избежать слишком долгого сообщения.

благодаря

Лучший ответ:

Вы должны возвращаться с булевым в обоих случаях, и не эхо сообщения, установите его:

function check_information($confirmation_password)
{
    $password = $this->input->post('password');
    if (strcmp($password, $confirmation_password))
    {
        $this->form_validation->set_message('check_information', 'password and confirmation password doesn't match');
        return FALSE;
    }
    else {
        return TRUE;
    }
}

Ответ №1

Существует простое решение, попробуйте следующее:

$this->form_validation->set_rules('confirmation_password', 'Password Confirmation', 'required|matches[password]');

Понравилась статья? Поделить с друзьями:
  • Предупреждение execve ошибка формата выполняемого файла
  • Предупреждение download failed please try again error code 561
  • Предупреждение download failed please try again error code 291
  • Предупреждение distributedcom 10016 windows 10 как исправить
  • Предупреждение 25523 как это исправить