【问题标题】:Avoiding form validation enforced checks on non-required fields in CodeIgniter避免表单验证对 CodeIgniter 中的非必填字段进行强制检查
【发布时间】:2011-06-25 21:42:16
【问题描述】:

我有一个电子邮件字段,在我的表单验证中不是必需的。它应该可以留空。但是,当我使用表单验证的 set_rules 的“valid_email”参数时,它仍然会给出一个错误消息,即如果该字段未填写,则不应检查该电子邮件是无效的。

【问题讨论】:

  • 请发布您的相关代码。

标签: codeigniter validation


【解决方案1】:

规则参考

在这件事上检查reference 告诉我们关于valid email 规则的以下内容:

如果表单元素不包含有效的电子邮件地址,则返回 FALSE。

对于空字段以及具有错误值的字段都是如此。

修剪

我注意到在 CodeIgniter 提供的示例中,电子邮件通常不仅是必需的,而且必须是有效的电子邮件,而且还会被修剪。这可能会导致不同的结果。

$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');

在验证过程中,考虑以下几点:

// If the field is blank, but NOT required, no further tests are necessary
if ( ! in_array('required', $rules) AND is_null($postdata))

您的电子邮件字段的内容可能不完全是 null,因此会引发 valid_email 要求的标记。

可能的相关错误

在此答案日期前三个月,有关此主题的 bitbucket 进行了讨论。可以通过https://bitbucket.org/ellislab/codeigniter-reactor/issue/117/input-fields-are-automatically-required查看讨论。

据说在标记中使用数组语法(见下文)会导致类似的错误,即使未设置required 规则:

<input name="user[email]" />

更多讨论和补丁,请点击此处http://codeigniter.com/forums/viewthread/159243。一个似乎可以解决问题的建议补丁是在上述代码中将is_null() 调用替换为empty()

所以如下:

if ( ! in_array('required', $rules) AND is_null($postdata))

变成:

if ( ! in_array('required', $rules) AND empty($postdata))

【讨论】:

  • 您的回答对我帮助很大。我使用基于数组的名称得到了这种行为,并且用空替换 is_null 确实做到了。不再有无意义的检查
  • 我想知道您是否可以修复最后两个链接。他们给出了 404 错误。随着 CodeIgniter 的出售,很多内容已经丢失或移动。谢谢。
  • @Sparky 我能够通过wayback 找到线程的缓存副本,但是 bitbucket 上的 repo 早已被删除,我无法挽救副本。道歉。
  • 别担心,我还是找到并修复了这个错误。我只是想你会想要修复或删除坏链接。仅供参考,需要修复的上述行位于system/libraries/Form_validation.php,可以通过使用位于application/libraries/MY_Form_validation.php 的您自己的“扩展”版本覆盖有问题的功能来修复。 See the "Extending Native Libraries" section here.
【解决方案2】:

根据https://codeigniter.com/user_guide/libraries/validation.html?highlight=validation#id28

使用permit_empty这个

允许字段接收空数组、空字符串、null 或 假的

所以你的代码看起来像这样:

$this->form_validation->set_rules('email', 'Email', 'permit_empty|valid_email');

【讨论】:

    【解决方案3】:

    您只需要意识到'' 不是一个有效的电子邮件地址。如果您不想验证某些 postdata 并且不在乎它是否为空,则不应对其设置规则,如下所示:

    if($this->input->post('item'))
    {
        $this->form_validation->set_rules('item', 'Item number', 'trim|alpha_numeric|max_length[30]');
    }
    

    在这种情况下,如果没有为“项目”提交任何内容,则不添加任何规则,因此其余数据将照常进入验证阶段等。

    【讨论】:

    • 在这种情况下,!empty() 语句不是必需的,因为根据文档,$this-&gt;input-&gt;post('something') 等于 if ( ! isset($_POST['something'])) { $something = FALSE; } else { $something = $_POST['something']; }
    • 谢谢,我已经澄清了我的答案。
    猜你喜欢
    • 2021-06-22
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多