У меня есть проблема в моем коде. Я создаю простой логин, используя 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)
Я пытаюсь отправить форму, чтобы вывести ошибку, $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 часа … Надеюсь, код читабельный.
Благодаря ~
1 ответ
Лучший ответ
«Невозможно получить доступ к сообщению об ошибке, соответствующему имени вашего поля»
Я предполагаю, что ошибка выше отображается, когда поле не имеет значения и нет обязательного правила:
Попробуйте установить правило, как показано ниже
$this->form_validation->set_rules('g-recaptcha-response', 'Captcha', 'required|callback_recaptcha');
ИЛИ (для последней версии CI)
$this->form_validation->set_rules(
'g-recaptcha-response', /* Field */
'Captcha', /* Label */
array( /* Rules */
'required',
array($this->your_model, 'recaptcha')
)
);
ИЛИ
$this->form_validation->set_rules(
'g-recaptcha-response', /* Field */
'Captcha', /* Label */
array( /* Rules */
'required',
array('my_recaptcha', array($this->your_model, 'recaptcha'))
),
array( /* Error lists */
'my_recaptcha' => 'Invalid Recaptcha'
)
);
Подробнее см.
Akshay Hegde
24 Янв 2017 в 11:32
Вопрос:
В настоящее время я использую 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]');
У меня есть функция обратного вызова check_captcha, которая проверяет, $row
is ==0
or == 1
(эта информация запрашивается из sql).
Проблема в том, что я не могу вызвать его из $self->form_validation->set_rule('captcha', 'call_back_check_captcha')
в связи с тем, что моя функция принимает $row
вар. То, как я это называю сейчас, я получаю сообщение об ошибке «Невозможно получить доступ». Как я могу заставить это работать?
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