验证在codeigniter中不起作用

时间:2017-10-10 12:27:17

标签: php codeigniter validation codeigniter-3

验证无效。所有表单字段都是动态的。这取决于用户他选择了多少个字段。如果他选择2,它将在视图中显示2个字段。如果选择3,那么它将显示3个字段,依此类推。我有超过30个字段

我在表单验证页面中设置了3个数组(用于测试目的,我只设置了3个。这将是字段总数)。如果我删除最后一个数组而不是验证工作,因为我在视图中只获得了2个字段。我无法在表单验证页面中使用超过2个数组。

是否必须要求视图中的字段数等于表单验证中的多组规则数组?

查看

这是我的动态视图页

*tags = _tags

Form_validation.php

<?php
   echo form_open('formbuilder_control/enxample_from_view');
    foreach ($data as $key) {// I am getting output
     $exp_fields_name=$key->fields_name;
     $exp_fields_type=$key->fields_type;
     $exp_form_elements=$key->form_elements;

    $abc=explode(',',$exp_form_elements);
        foreach ($abc as $value) {
          if ($exp_fields_name == $value) {?>
          <div class="form-group row label-capitals">
                  <label class="col-sm-5 col-form-label"><?php echo $exp_fields_name;?></label>
                  <div class="col-sm-7">
                  <input type="<?php echo $exp_fields_type;?>" name="<?php echo $exp_fields_name;?>" placeholder="<?php echo $value;?>" class="form-control" />
                   <?php echo form_error($exp_fields_name); ?>
                </div>
                </div>
                  <?php 
           }}}?>

              <div class="form-buttons-w btn_strip">
                <input type="submit" name="submit" value="Save" class="btn btn-primary margin-10">
              </div>

    <?php echo form_close(); ?>

控制器

$config = array(
    'test'=>array(

     array('field' =>'firstname', 
           'label' => 'First Name',
            'rules' => 'required'
    ),
        array('field' => 'lastname',
              'label' => 'lastname',
              'rules' => 'required'
              ),

     array('field' => 'middlename',
           'label' => 'middlename',
           'rules' => 'required'
         )
     ),
);

4 个答案:

答案 0 :(得分:2)

当然会失败。您的验证规则将“中间名”字段定义为required,该字段甚至不存在于表单中。

缺少的字段不能满足required规则。

答案 1 :(得分:0)

好吧,因为您希望拥有一组验证规则,并且您有两种不同的表单需要验证,您可以使用Codeigniter的验证callback函数使用非常好的选项。 我将在这里发布一个简单的例子:

您的观看文件:

<!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <?php echo form_open('formbuilder_control/test');?>
        <input type="text" name="firstname">
        <input type="hidden" name="which_form" value="first_form">
         <?php echo form_error('firstname'); ?>
        <input type="text" name="lastname">
         <?php echo form_error('lastname'); ?>
        <input type="submit" name="submit" value="submit">
    <?php echo form_close(); ?>
    <?php echo form_open('formbuilder_control/test');?>
        <input type="text" name="firstname">
        <input type="hidden" name="which_form" value="second_form">
         <?php echo form_error('firstname'); ?>
        <input type="text" name="lastname">
         <?php echo form_error('lastname'); ?>
        <input type="text" name="middlename">
         <?php echo form_error('middlename'); ?>
        <input type="submit" name="submit" value="submit">
    <?php echo form_close(); ?>
</body>
</html>


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

class YourController extends CI_Controller {

    public function save() 
    {
        //.... Your controller method called on submit

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

        // Build validation rules array
        $validation_rules = array(
                                array(
                                    'field' => 'A',
                                    'label' => 'Field A',
                                    'rules' => 'trim|xss_clean'
                                    ),
                                array(
                                    'field' => 'B',
                                    'label' => 'Field B',
                                    'rules' => 'trim|xss_clean'
                                    ),
                                array(
                                    'field' => 'C',
                                    'label' => 'Field C',
                                    'rules' => 'trim|xss_clean|callback_required_inputs'
                                    )
                                );
        $this->form_validation->set_rules($validation_rules);
        $valid = $this->form_validation->run();

        // Handle $valid success (true) or failure (false)

    }


    public function required_inputs()
    {
        if( $this->input->post('which_form') == "second_form" && !$this->input->post('middlename'))
        {
            $this->form_validation->set_message('middlename', 'Middle name is required!');
            return FALSE;
        }

        return TRUE;
    }
}

从上面的例子中你可以看到required_inputs函数就像一个普通的函数,你可以编写任何PHP代码。 所以我建议的是,在两个表单中都有一个隐藏字段,jus来检查提交的表单,然后为middlename验证规则设置回调函数,在该函数中,检查用户提交的表单,并基于它,返回TRUE或FALSE。

我希望这能让你完全了解自己能做些什么。

您只需在每个表单中添加一个具有不同值的隐藏字段,并检查回调函数中的值以决定是否应该应用第三个验证规则。

答案 2 :(得分:0)

可以使用最少的代码来设置灵活的规则集。考虑这个form_validation.php示例

<?php

$first_last = array(
  array('field' => 'firstname',
    'label' => 'First Name',
    'rules' => 'required'
  ),
  array('field' => 'lastname',
    'label' => 'lastname',
    'rules' => 'required'
  ),
);

$middle_name = array(
  array('field' => 'middlename',
    'label' => 'middlename',
    'rules' => 'required'
  )
);

$config = array(
  'fullname' => array_merge($first_last, $middle_name), //first, middle and last name fields
  'shortname' => $first_last, //only first and last name fields
);

这提供了两组不同的字段供form_validation->run()使用。

例如:在使用第一个,中间名和姓氏字段的表单上

if($this->form_validation->run('fullname'))
{   
   ... 

或者,表单只包含名字和姓氏字段

if($this->form_validation->run('shortname'))
{   
   ... 

答案 3 :(得分:0)

正如其他人所提到的,你需要一个不存在的领域。你要么:

  • 在视图中添加名称为middlename
  • 的字段
  • 删除需要字段middlename存在的验证规则

没有为您的问题做出贡献,但在可用性方面,您可能希望更改lastnamemiddlename规则中的标签,以使其更加用户友好。

$config = array('test'=>array(

 array('field' =>'firstname', 
       'label' => 'First Name',
        'rules' => 'required'
),
    array('field' => 'lastname',
          'label' => 'lastname',
          'rules' => 'required'
          ),

 array('field' => 'middlename',
       'label' => 'middlename',
       'rules' => 'required'
     )
 ),
);

此外,如果您未尝试要求middlename但希望在插入数据库之前清理或验证其格式,则该文档还提供了有关不同自定义规则的其他有用提示。

https://www.codeigniter.com/userguide3/libraries/form_validation.html#form-validation-tutorial