【问题标题】:Validation is not working in codeigniter验证在 codeigniter 中不起作用
【发布时间】:2017-10-10 12:27:17
【问题描述】:

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

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

是否强制要求视图中的字段数等于表单验证中的一组规则数组?

查看

这是我的动态视图页面

<?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(); ?>

Form_validation.php

$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'
         )
     ),
);

控制器

public function test()
{

        if($this->form_validation->run('test') == TRUE) 
        {
                echo "working";
        }
$this->load->view('test1');
}

【问题讨论】:

  • 请分享不赞成票的原因,以便我将来改进
  • 为什么要保留三个验证规则,而表单没有三个字段?
  • @HimanshuUpadhyay,对
  • 我有两个表格。在第一种形式中,字段是名字、姓氏、中间名。在第二种形式中,字段是名字和姓氏。我只需要使用一组规则。
  • 为什么要保留三个验证规则,而表单没有三个字段?

标签: php codeigniter validation codeigniter-3


【解决方案1】:

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

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

【讨论】:

  • 那么有没有其他方法可以处理这个问题?
  • 处理什么?我什至不明白你想做什么。
  • 我有两个表格。在第一种形式中,字段是名字、姓氏、中间名。在第二种形式中,字段是名字和姓氏。我只需要使用一组规则。
  • 那么可以这样使用吗?
  • 没有。验证规则本质上是表单的服务器端定义;你不能只有一套规则有两种不同的形式。
【解决方案2】:

可以用最少的代码拥有灵活的规则集。考虑这个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-&gt;run()

例如:在使用名字、中间名和姓氏字段的表单上

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

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

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

【讨论】:

  • 其实我有动态表单,它会返回2个字段或三个字段或一个字段不确定。这完全取决于客户。这就是为什么我只使用一套规则
  • 思路适应性强,使用的规则集也可以动态选择。
  • $first_last=array(// rules) 我必须这样做并传递给 $config = array(// rules) ?
  • 而且我的表单中有 30 多个字段。这完全取决于用户。他可以使用多少个字段。
  • 有了这么多字段,您可能不想使用form_validation.php 来定义规则集。您需要使用set_rules(),因为字段会动态添加到表单中。
【解决方案3】:

正如其他人所提到的,您需要一个不存在的字段。您需要:

  • 在视图中添加一个名为 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

【讨论】:

  • 实际上问题是我有 30 多个字段,这完全取决于用户他需要如何验证 mya 字段。
  • 所以这些字段不应该是必需的,因为每次都需要它们。在不了解不同视图的更多信息、何时需要哪些字段的逻辑等情况下,在保存控制器中使用不同的方法并根据表单设置适当的保存 URL 可能会更容易。
  • 这种形式的验证的想法是告诉它哪些字段必须采用哪种格式的规则。如果它是基于不同字段中的值具有不同规则的单个表单,那么您可能希望查看我在答案中附加的文档中的自定义规则。
【解决方案4】:

好吧,由于您想要一组验证规则并且您有两种不同的表单要验证,您可以使用 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代码。 所以我的建议是,在两个表单中都有一个隐藏字段,只需检查提交了哪个表单,然后为middlename 验证规则设置回调函数,并在该函数中检查用户提交的表单,然后基于它,返回 TRUE 或 FALSE。

我希望这能让你全面了解你能做什么。

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

【讨论】:

  • 其实我有动态表单,它会返回2个字段或三个字段或一个字段不确定。这完全取决于客户如何形成他需要的字段。这就是为什么我只使用一套规则
  • 在公共函数 required_inputs() 中,我有 30 多个字段,我必须在 if 条件下使用每个输入帖子?像你一样! $this->input->post('A') 等等
  • 是的,您需要为可能出现或未出现的字段执行操作。
  • 在IF条件下写所有字段可不是什么好事。
  • @Hybreeder,验证规则是一堆数组,所以我们不能在数组本身写任何条件,所以 Codeigniter 有一个很棒的功能,我们可以为我们的验证规则设置一个回调函数,它将允许您根据所需的任何条件管理验证规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多