背景
使用Codeigniter
与form_helper
和form_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()
和post()
函数(请参见下文),那么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);
}
答案 0 :(得分:3)
如果已在输入上运行规则,则两个函数都将返回修改后的值。
如果您想从表单中读取帖子值, USE $this->input->post()
。
set_value()
用于重新填充表单验证失败。
它没有额外的过滤,所以它更快,但我更喜欢你应该使用$this->input->post()
来保证安全。
答案 1 :(得分:2)
虽然在某些情况下$this->form_validation->set_value()
可能更快,[看看下面的基准],但这两种方法之间最重要的区别是准备 XSS过滤$this->input->post()
方法中的选项。
在表单验证类,all fields are stored in $this->_field_data
属性中,值直接来自$_POST
,而$this->form_validation->set_value()
方法仅来自returns data from $this->_field_data
。
输入类准备XSS过滤选项,您可以考虑使用它来将值存储到数据库中。
注意:强>
请注意$this->input->post()
方法does NOT loop through the entire $_POST
by default,除非在没有特定$index
参数的情况下调用它。
系统信息:
CPU: 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 User Guide中有解释。
答案 2 :(得分: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();
}
然后调用此函数并匹配结果。