【问题标题】:Manipulating input before using it with CodeIgniter's Form Validation Class在使用 CodeIgniter 的表单验证类之前操作输入
【发布时间】:2011-06-16 19:39:38
【问题描述】:

既然你不能这样做:$this->form_validation->set_rules($VARIABLE, 'Some text', 'required');,是否可以做类似的事情:

$variable = $this->input->post('some_input');
$variable = some_function_which_manipulates_the_input($variable);

$this->form_validation->set_rules($i_want_the_variable_here, '', '');

在验证检查之前操作输入?添加自定义回调对我来说似乎有点笨拙,因为一种方法可以做几件事(不一定针对 X 验证字段)。

【问题讨论】:

    标签: php codeigniter validation


    【解决方案1】:

    既然你不能这样做:$this->form_validation->set_rules($VARIABLE, 'Some text', 'required');

    您当然可以这样做,只要$VARIABLE 包含您要验证的字段的name 属性。

    看起来您将实际的$_POST 值作为set_rules() 的第一个参数传递——它实际上应该是字段名称。参见设置规则部分:

    http://codeigniter.com/user_guide/libraries/form_validation.html#validationrules

    $this->form_validation->set_rules();

    上面的函数需要三个 参数作为输入:

    • 字段名称 - 您为表单字段指定的确切名称。
    • 此字段的“人”名,将插入到错误中 message.Names。
    • 此表单域的验证规则。

    如果您想在验证之前或之后更改输入的实际值,只需添加一个或多个“准备”规则。

    http://codeigniter.com/user_guide/libraries/form_validation.html#preppingdata

    任何接受一个参数的原生PHP函数都可以作为规则使用,如htmlspecialchars、trim、MD5等。

    注意:您通常会希望在验证规则之后使用准备函数,因此如果出现错误,原始数据将显示在表单中。

    你也可以使用之前的规则,如果你想trim() 一些东西之前 验证例如。回调也可以工作,它们与表单验证库的任何函数或任何普通 php 函数的用途相同 - 通过返回 TRUE/FALSE 验证数据,或更改数据 - 请注意,默认情况下,回调必须属于到运行验证的控制器。您也可以使用自己的辅助函数,即在验证数据时对当前脚本可用的任何内容。

    【讨论】:

      【解决方案2】:

      您可以在表单验证之前直接修改$_POST

      例如

      // Populate slug automatically
      if (!$this->input->post('slug'))
      {
          $_POST['slug'] = url_title($this->input->post('title'), '-', true);
      }
      
      $this->form_validation->set_rules('title', 'Title', 'trim|required');
      $this->form_validation->set_rules('slug', 'Slug', 'trim|required|is_unique[categories.slug]');
      
      if ($this->form_validation->run())
      

      【讨论】:

        【解决方案3】:

        您可以在验证规则之前将输入值放入数组中。我不知道你想做什么操作,但你可以做这样的事情

         $dat = array(
                   'fname' => filter_var($this->input->post('fname'), FILTER_SANITIZE_STRING),
                   'lname' => filter_var($this->input->post('lname'), FILTER_SANITIZE_STRING),
                   'email' => filter_var($this->input->post('email'), FILTER_SANITIZE_EMAIL),
                   'phone' => $this->input->post('phone'),
                   'relate' => filter_var($this->input->post('relate'), FILTER_SANITIZE_STRING),
                    );
        $this->form_validation->set_rules('lname', 'Last Name', 'required|trim|min_length[3]');
        

        然后继续

         $this->db->update('contacts', $dat);
        

        在设置规则之前,您可以使用数组中的大多数东西来操作它

        【讨论】:

        • 这不会在验证之前操作输入,它只是创建一个新的数据数组,可能在验证之后有用,但多余,因为理想情况下 - 在使用表单验证库进行处理之前,您已经过滤和验证了数据。换句话说,被验证的输入将不是$dat数组。
        • 他询问如何在验证之前操作数据,他几乎可以使用任何功能,例如 ucwords、strip tags 等。我只是举了一个使用 filter var 进行操作的示例。即使我不对数据进行任何操作,我也总是在验证之前创建这个数组。无论如何,数据仍会通过表单验证进行验证。但我接受你的观点
        • 只有在验证之前直接修改了 $_POST 数组时,这才有效。此外,如果您选择以这种方式执行此操作,则使用的任何准备规则都将被忽略。正在验证的数据是 $_POST 数据,而不是您创建的数组的值。您传递给模型的数据不是经过验证的数据。我说得通还是遗漏了什么?
        • 不,你没有错过任何东西,我明白你在说什么,并说你是对的
        猜你喜欢
        • 1970-01-01
        • 2021-07-04
        • 2015-10-12
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        • 2017-04-29
        • 2016-06-12
        • 1970-01-01
        相关资源
        最近更新 更多