1

背景 使用Codeigniterwithform_helperform_validation做一些表单处理。表单已controller.

现在我们需要使用model该类将这些数据放入数据库中。

假设

让我们假设我们的表单有几个输入元素(例如>20)。

问题 以下哪个代码片段会更有效?Both snippets are obviously inside the controller method to which the form submits data.

代码片段 1

if ($this->form_validation->run())
{
    // validation successful, now collect the values in a variable to pass it to the model.
    $form_data['field1'] = $this->form_validation->set_value('field1');
    $form_data['field2'] = $this->form_validation->set_value('field2');
    // AND SO ON
    $form_data['fieldN'] = $this->form_validation->set_value('fieldN');

    // Now put this data into database.
    $this->corresponding_model->write_to_db($form_data);
}

代码片段 2

if ($this->form_validation->run())
{
    // validation successful, now collect the values in a variable to pass it to the model.
    $form_data['field1'] = $this->input->post('field1');
    $form_data['field2'] = $this->input->post('field2');
    // AND SO ON
    $form_data['fieldN'] = $this->input->post('fieldN');

    // Now put this data into database.
    $this->corresponding_model->write_to_db($form_data);
}

所以本质上我要问的是:获取某些任意表单元素的发布数据更好吗?$this->input->post还是$this->form_validation->set_value()

PS:如果我们查看代码中的set_value()andpost()函数(请参见下文),显然set_value()会更快,因为post()循环遍历整个$_POST. 所以从某种意义上说,它也是关于什么是最佳实践?

Form_validation.php, set_value() 方法

public function set_value($field = '', $default = '')
{
    if ( ! isset($this->_field_data[$field]))
    {
        return $default;
    }

    // If the data is an array output them one at a time.
    //     E.g: form_input('name[]', set_value('name[]');
    if (is_array($this->_field_data[$field]['postdata']))
    {
        return array_shift($this->_field_data[$field]['postdata']);
    }

    return $this->_field_data[$field]['postdata'];
} 

Input.php, post() 方法

function post($index = NULL, $xss_clean = FALSE)
{
    // Check if a field has been provided
    if ($index === NULL AND ! empty($_POST))
    {
        $post = array();

        // Loop through the full _POST array and return it
        foreach (array_keys($_POST) as $key)
        {
            $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
        }
        return $post;
    }

    return $this->_fetch_from_array($_POST, $index, $xss_clean);
}
4

3 回答 3

4

Both functions will return the modified value if rules have been run on the input.

When you want to read a post value from form, USE $this->input->post().

set_value() is used to re-populate a form has failed validation. There is no additional filtering on it, so it faster but I prefer you should use $this->input->post() for the secure.

于 2013-06-20T18:27:19.117 回答
2

虽然在某些情况下$this->form_validation->set_value() 可能会更快,[看看下面的基准测试],这两种方法之间最重要的区别是在方法中准备了XSS过滤选项$this->input->post()

表单验证 :: set_value() 功能

表单验证类中,所有字段都存储在$this->_field_data属性中,值$_POST直接来自,$this->form_validation->set_value()方法只返回数据$this->_field_data

输入 :: post() 功能

Input Class准备了一个 XSS 过滤选项,您可以考虑使用它来将值存储到数据库中。

注意:
请注意,默认情况下$this->input->post()方法不会循环整个,除非在没有$_POST特定$index参数的情况下调用它。

基准

系统信息:

中央处理器: Intel Core-i5 760 @ 2.80 GHz 内存: 2.00 GB

测试用例: 一个 30 个字符的字符串文本字段。

set_rules()                   0.0000
Check Validation              0.0003
set_value()                   0.0000
Form Validation (Overall)     0.0024

post() without XSS filtering  0.0000
post() with XSS filtering     0.0002

结论

如果您需要在将值存储到数据库之前执行 XSS 过滤,我建议使用 CodeIgniter Input 类。此外,还有更多的输入类服务的安全过滤操作,在CodeIgniter 用户指南中进行了解释。

于 2013-06-20T11:22:20.453 回答
0

有时代码片段 #1,有时 - #2。在大多数情况下 $this->input->post() 更快。但它可能取决于环境代码和数据。您可以轻松检查在您的情况下什么更快:

public function codeSnippet1(){
ob_start();
$this->output->enable_profiler(TRUE);
// your code here

ob_end_flush();
}

public function codeSnippet2(){
ob_start();
$this->output->enable_profiler(TRUE);
// your code here

ob_end_flush();
}

然后调用这个函数并匹配结果。

于 2013-06-20T17:37:35.920 回答