【问题标题】:Extending Validation Library - CI2扩展验证库 - CI2
【发布时间】:2013-05-21 13:23:01
【问题描述】:

我需要为学生 ID 设置验证,并且 CI 原生库没有削减它,所以我扩展了它。然而,我在让它工作时遇到了问题,而且我不太清楚我在哪里搞砸了。这是我在 REGEX 的第一次破解,所以请放轻松。这是我的代码:

<?php

 if(!defined('BASEPATH')) exit('No direct script access allowed');

 class MY_Form_validation extends CI_Form_validation
 {

     public function is_valid_student_id($str)
     {
         if(strlen($str) > 9)
         {
             $this -> set_message('is_valid_student_id', 'A-Number can not be over 9 characters');
             return FALSE;
         }
         elseif(strlen($str) < 9)
         {
             $this -> set_message('is_valid_student_id', 'A-Number can not be under 9 characters');
             return FALSE;
         }
         elseif((($str[0]) !== 'a') && (($str[0]) !== 'A'))
         {
             $this -> set_message('is_valid_student_id', 'A-Number must begin with the letter "A"');
             return FALSE;
         }
         elseif(ctype_alpha($str[0]))
         {
             if(is_numeric(substr($str, 1, strlen($str) - 1)))
             {
                 return TRUE;
             }
             else
             {
                 $this -> set_message('is_valid_student_id', 'A-Number must have 8 digits 0 - 9');
                 return FALSE;
             }
         }
         else
         {
             $this -> set_message('is_valid_student_id', 'A-Number must begin with the letter "A"');
             return FALSE;
         }

     }

 }

然后使用验证我这样做:

if (!$this->input->post('student') == 'yes') {
    $this->form_validation->set_rules('anum', 'A Number', 'required|is_valid_student_id|exact_length[9]');
}

我一直在关注这些good /// tutorials,但我还是有点困惑。任何帮助都会很棒。谢谢

【问题讨论】:

  • 您应该只为这条规则运行一个preg_match(),如果它失败,让您的错误消息包含对数字的要求。对于单个字符串验证来说,这是很多额外的逻辑。
  • 我完全同意你的观点!但是我的老板没有 - 哈哈。他希望学生确切地知道为什么他们的学生证不起作用。以我的 PHP 知识水平,这是满足用户要求的最简单方法。至少现在,学生在打字时遇到的每一个问题都是可以预测的。

标签: php regex codeigniter validation


【解决方案1】:

如果您使用callback_ 语法,则调用的函数需要在控制器上。但是,如果您直接将其添加到Form_Validation 库中,则不需要callback_。试试这个:

$this->form_validation->set_rules(
      'anum', 'A Number', 'required|is_anum|exact_length[9]');

【讨论】:

  • 附带说明:您可能需要重新考虑该函数名称。当我看到is_anum 时,我认为它的意思是“是字母数字的”或类似的东西。也许“is_valid_student_id”?
  • 我按照你说的做了,去掉了回调,改了函数名,但是我还是没有得到任何验证错误。
  • 你能得到 any 错误吗?如果没有,请确保错误报告已打开。如果您正在进行单元测试(如果不是,为什么不),请确保 is_valid_student_id 始终如一地返回您期望的结果。
  • 您确定您在 anum 中获得了不合适的值吗? (这不是第一次意外覆盖字段)
  • 我只是做了一个 $str 的 var_dump ,但我什么也没显示。可能是因为 $str 是一个空值/没有值吗?我打开了错误报告,没有显示任何错误。
【解决方案2】:

我认为不需要扩展库只需在控制器中创建一个回调方法并在其中添加上述代码...只需创建一个名为 is_anum 的方法并将您的代码放入其中

if (!$this->input->post('student') == 'yes') {
            $this->form_validation->set_rules('anum', 'A Number', 'required|callback_is_anum|exact_length[9]');
        }

function is_anum($str)
{
if (((substr($str, 0) !== 'a') || substr($str, 0) !== 'A') && (!preg_match("/[^0-9]/", $str) )) // If the first character is not (a or A) and does not contain numbers 0 - 9 
        { // Set a message and return FALSE so the run() fails
            $this->set_message('is_anum', 'Please enter a valid A-Number');
            return FALSE;
        } else 
        {
            return TRUE;
        }
    }

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多