【问题标题】:Codeigniter using form validation function "matches" with sub-array POSTCodeigniter 使用表单验证功能“匹配”子数组 POST
【发布时间】:2014-10-17 14:34:21
【问题描述】:

上周刚开始使用 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 方括号之间的任何字符串,并尝试直接从$_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["input"]["password"] === $_POST["input"]["conf_password"]

我不确定我缺少什么,因为 CI 中与表单相关的所有内容都可以很好地与数组一起使用,为什么不使用这个函数?

【问题讨论】:

  • 返回!($str !== $field)
  • 实际上它会在 if 中返回 false ! isset($_POST[$field])
  • 我在想另一种写法,与你的问题无关。

标签: php forms codeigniter validation


【解决方案1】:

是的,我有一个类似的问题,CI 核心输入无法解决这个问题,我不是通过创建自定义回调函数来解决我的问题,它经常使控制器混乱,而是通过扩展 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_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 似乎是个好主意。你把 MY_CI_Input 放在哪里了?
  • 看看我的编辑,我在这里有类似的答案 stackoverflow.com/questions/21046166/… 抱歉是 CI_Form_validation 而不是 CI_Input 我改变了答案
【解决方案2】:

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

【讨论】:

  • 你是真的运行了这段代码还是只是把它从你的脑海中抽出来?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2014-11-03
  • 2013-04-29
相关资源
最近更新 更多