16

我正在使用 CodeIgniter 编写表单验证类。有什么方法可以让我在名称值对中收到错误消息?例如,在示例表单中有四个字段:user_namepasswordpassword_conftimezone。其中user_namepassword执行以下操作后验证失败:

$result = $this->form_validation->run();

如果上面的函数返回 false,我想得到名称值对中的错误,如下所示:

Array
{
  'user_name' => 'user name is required',
  'password' => 'passord is required'
}

我真的想形成一个 JSON,我可以将它传递回 AJAX 调用。我有一个(肮脏的)解决方案:我可以像下面这样一个一个地调用验证方法:

$this->form_validation->required($user_name);
$this->form_validation->required($password);

有没有其他方法可以一次在名称值对中获取所有错误消息?

编辑:有人建议我从答案之一中使用 jQuery 进行验证:

jQuery 将有助于客户端验证,但服务器端呢,我正在使用 CodeIgniter 验证。

我设计它是为了:

  1. 我使用 AJAX 发布所有值。
  2. 在服务器端(PHP)验证。
  3. 如果输入有效,则执行所需的操作;否则返回错误给用户。
4

7 回答 7

16

通过查看 CodeIgniter 代码,我自己找到了一种方法:我扩展了 CI_Form_validation 库,例如:-

class MY_Form_validation extends CI_Form_validation
{
    public function getErrorsArray()
    {
        return $this->_error_array;
    }
}

我知道,这是一个 hack,但会满足我的时间需求。我希望 CodeIginter 团队很快能提供一个访问该数组的接口。

于 2009-01-22T15:05:59.397 回答
4

你可以简单地使用,

$this->form_validation->error_array();

这是来自 CodeIgniter 的类参考文档

于 2016-11-13T20:02:05.587 回答
1

我最喜欢的解决方案不涉及在任何地方添加函数或扩展验证库:

$validator =& _get_validation_object();
$error_messages = $validator->_error_array;

参考:http ://thesimplesynthesis.com/post/how-to-get-form-validation-errors-as-an-array-in-codeigniter/

您应该可以在代码中的任何位置调用它。此外,值得注意的是还有一个更新的线程也讨论了这个问题。

于 2013-03-21T14:35:55.223 回答
1

您可以在控制器中创建私有函数

    private function return_form_validation_error($input)
{
    $output = array();
    foreach ($input as $key => $value)
    {
        $output[$key] = form_error($key);
    }
    return $output;
}

然后在您的验证方法中,只需调用它,这是我的

public function add_cat_form()
    {
        $this->output->unset_template();
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'Name', 'required');
        if ($this->form_validation->run())
        {
            if (IS_AJAX)
            {
                $dataForInsert = $this->input->post();
                if ($dataForInsert['parentid'] == -1)
                {
                    unset($dataForInsert['parentid']);
                }
                $this->post_model->add_cat($dataForInsert);
                echo json_encode('success');
            } else
            {
                #in case of not using AJAX, the AJAX const defined
            }
        } else
        {
            if (IS_AJAX)
            {
                #This will be return form_validation error in an array
                $output = $this->return_form_validation_error($this->input->post());
                echo $output = json_encode($output);
            } else
            {
                #in case of not using AJAX, the AJAX const defined
            }
        }
    }

于 2015-02-08T18:13:46.170 回答
0

看到代码点火器验证会在正常页面刷新时为您提供错误消息,使用像jquery 验证插件这样的东西会更好吗?它将在发送表单之前完全验证客户端?这样就不需要 AJAX。

编辑:我不是建议不要进行服务器端验证,只是为了验证而使用 AJAX 发布是没有必要的,如果你在客户端进行它会减少服务器命中。它将优雅地降级为常规页面刷新,并显示错误或成功消息。

于 2009-01-22T11:22:56.807 回答
0

已经有一个正确的答案,但我认为这个更容易理解如何执行这个过程。

在您的控制器中执行此操作

$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() === FALSE){
    $data['error'] = validation_errors();
}else{
  //success
}
echo json_encode($data);

在你的JS中做

success:function(response){
 if(response.error){
  $('#notif').html(response.error); 
 }else{
   //do stuff here...
 }
}

最后在你的js中显示与给定id对应的错误。

在您的HTML中执行此操作

<span id="notif"></span>
于 2018-11-24T04:29:23.383 回答
0

这可能为时已晚,但我想分享一个我使用过的解决方案,希望它能让其他人受益。

Unfortunately, CodeIgniter's $this->form_validation->error_array() method returns only the errors that emanate from the set_rules() method. It does not account for the name of the form field that generated the error. However, we can leverage another of CodeIgniter's method $this->form_validation->error(), which returns the error(s) associated with a particular form field, by passing the name of the field as parameter.

//form validation rules
$this->form_validation->set_rules('f_name', 'First Name', 'trim|required', 
    ['required' => 'First Name is required']
);
$this->form_validation->set_rules('l_name', 'Last Name', 'trim|required', 
    ['required' => 'Last Name is required']
);
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email|is_unique[users.email]', 
    [
        'required'      => 'Email is required',
        'valid_email'   => 'Email format is invalid',
        'is_unique'     => 'Email already exists'
    ]
);
$error_arr = []; //array to hold the errors
//array of form field names
$field_names= ['f_name', 'l_name', 'email'];
//Iterate through the form fields to build a field=error associative pair.
foreach ($field_names as $field) {
    $error = $this->form_validation->error($field);
    //field has error?
    if (strlen($error)) $error_arr[$field] = $error;
}

//print_r($error_arr);
于 2019-11-10T07:53:25.493 回答