Codeigniter使用表单验证功能“匹配”子数组POST

时间:2014-08-24 06:16:08

标签: php forms codeigniter validation

上周刚开始使用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_Validation.php之后,我发现matches会接受我放在matches的方括号之间的任何字符串,并尝试从{{1}获取值直接。

CI代码:

$_POST

因此,没有/** * 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; } 这样的东西。

我知道我可以使用

来解决这个问题
  1. 自定义验证功能
  2. 直接比较$ _POST [“输入”] [“密码”] === $ _POST [“输入”] [“conf_password”]
  3. 我不确定我缺少什么,因为与表格相关的CI中的所有内容都与数组很好地协作,为什么这个功能不起作用?

2 个答案:

答案 0 :(得分:1)

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

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

os你会把你写成

$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_validationMY_是您在配置中定义的内容。您放在此处的任何内容都会自动添加到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
}

答案 1 :(得分:0)

您可以编辑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;
    }