使用表单验证函数的编码器"matches"与子数组POST


Codeigniter using form validation function "matches" with sub-array POST

上周刚开始使用CI,遇到了这个问题。如果我将表单数据作为数组传递,该在matches函数中放入什么?

我在html表单中使用数组来定位单个数组内的所有输入字段,以防我想传递用户生成的输入,如多个电话号码或电子邮件。所以所有东西都放在数组中,比如:

    <div>
        <label for="password">Password</label>
        <input type="password" name="input[password]" id="password" value="<?php echo set_value("input[password]")?>"/>
    </div>
    <div>
        <label for="password">Confirm Password</label>
        <input type="password" name="input[conf_password]" id="conf_password" value="<?php echo set_value("input[conf_password]")?>"/>
    </div>

注意*name="input[password]"*

验证工作就像一个魅力,除了当我使用函数matches:

$this->form_validation->set_rules("input[password]", "Password", 'required|matches[input[conf_password]]');
$this->form_validation->set_rules("input[conf_password]", "Confirm Password", 'required');
matches[input[conf_password]]

这将不起作用,因为在我检查了form_validate .php之后,我发现matches将采取我放在matches的方括号之间的任何字符串,并试图直接从$_POST获取值。

CI代码:

/**
     * Match one field to another
     *
     * @access  public
     * @param   string
     * @param   field
     * @return  bool
     */
    public function matches($str, $field)
    {
        if ( ! isset($_POST[$field]))
        {
            return FALSE;
        }   
        $field = $_POST[$field];    
        return ($str !== $field) ? FALSE : TRUE;
    }

所以应该没有$_POST[input[conf_password]]这样的东西。

我知道我可以使用

来解决这个问题
  1. 自定义验证函数
  2. 比较直接$ _POST["输入"]["密码"]= = = $ _POST["输入")("conf_password")

我不确定我错过了什么,因为一切在CI相关的形式是很好地与数组工作,为什么不这个函数?

是的,我有一个类似的问题,没有办法CI核心输入可以解决这个问题,我解决了我的不是通过创建一个自定义回调函数,它经常使控制器混乱,而是通过扩展Form_validationMY_Form_validation

,然后我创建了一个函数,我称之为matches_array,然后用作matches_array[inputkeyname---inputkeyvalue]

那么你就写成

$this>form_validation>set_rules("input[password]","Password",'required|matches_array[input---conf_password]');

这是我记得的函数。

public function matches_array($str, $field)
{
    $field = explode('---',$field);
    if ( ! isset($theField = $_POST [$field[0] ][ $field[1] ]))
    {
        return FALSE;
    }  
    return ($str !== $theField) ? FALSE : TRUE;
}

编辑

把它放在你的app/libraries上,命名为MY_Form_validation, MY_是你在配置中定义的。你在这里输入的任何东西都会自动添加到rules .

class MY_Form_validation extends CI_Form_validation 
{
    public function __construct($rules = array())
    {
        parent::__construct($rules);
        $this->CI->lang->load('MY_form_validation');
    }
    //your custom functions
}

可以编辑MY_Form_validation

public function matches($str, $field)
    {
        return isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])
        ? ($str === $this->_field_data[$field]['postdata'])
        : FALSE;
    }