0

好的,所以我在用户注册中实现了出生日期。我现在想要做的是在他们注册之前检查他们的出生日期并检查他们是否超过特定年龄(13)。他们我做 DOB 的方式有点奇怪,但它确实有效。我有 3 个字段 dob1、dob2、dob3。CodeIgniter:Tank Auth,在这里添加出生日期问题是我如何实现它,如果有人感兴趣的话。无论如何,这是我迄今为止一直在尝试的:编辑:用户输入的语法是 mm dd yyyy

function is_old_enough($input, $dob1, $dob2) {
          $dob = $dob1.$dob2.$input;
          $date = date('md').(date('Y')-13);
          if ((int)$dob < (int)$date)
            $this->form_validation->set_message('is_old_enough', 'You are not old enough to have an account on this site.');
          return $input;
        }

这是 register() 函数内部的内容。

$this->form_validation->set_rules('dob1', 'Date of Birth Month', 'trim|required|xss_clean|exact_length[2]');
$this->form_validation->set_rules('dob2', 'Date of Birth Day', 'trim|required|xss_clean|exact_length[2]');
$this->form_validation->set_rules('dob3', 'Date of Birth Year', 'trim|required|xss_clean|exact_length[4]|callback_is_old_enough[dob1||dob2]');

我接近了吗?我走远了吗?有人帮忙吗?现在它所做的只是假装我从未创建过这个回调并让用户加入,即使用户太年轻了。我知道它正确调用了函数,因为我对变量有一些问题。帮助?

编辑:布伦丹的回答对我帮助很大,但主要问题是逻辑错误。所以这就是我现在的工作方式:

//Check if user is old enough
function is_old_enough($input) {
    $dob = $this->input->post('dob3').$this->input->post('dob1').$this->input->post('dob2');
    $date = (date('Y')-13).date('md');
    if ((int)$dob > (int)$date) {
        $this->form_validation->set_message('is_old_enough', 'You are not old enough to register on this site.');
        return FALSE;
    }
    return TRUE;
}


$this->form_validation->set_rules('dob1', 'Date of Birth Month', 'trim|required|xss_clean|exact_length[2]');
$this->form_validation->set_rules('dob2', 'Date of Birth Day', 'trim|required|xss_clean|exact_length[2]');
$this->form_validation->set_rules('dob3', 'Date of Birth Year', 'trim|required|xss_clean|exact_length[4]|callback_is_old_enough[]');
4

1 回答 1

1

首先,您最多只能在回调中传递两个参数。其次,如果您从回调中返回非布尔值,则返回的任何内容都将替换您运行回调的字段的值。

如果您尝试检查某些内容是否有效,那么它的工作方式(本质上)是:

function _callback_for_field($input)
{
    // check if $input is valid based on your own logic
    if($input == YOUR_LOGIC_HERE)
    {
        return TRUE;
    }
    return FALSE;
}

但是对于你正在做的事情,特别是:

// Birthdate rules
$this->form_validation->set_rules('birthdate-month','Birthdate Month','required|is_natural_no_zero|greater_than[0]|less_than[13]');
$this->form_validation->set_rules('birthdate-day','Birthdate Day','required|is_natural_no_zero|greater_than[0]|less_than[32]');
$this->form_validation->set_rules('birthdate-year','Birthdate Year','required|is_natural_no_zero|greater_than[1930]|less_than['.(date("Y") - 18).']');

我故意不竭尽全力阻止未满 18 岁的人注册,因为如果他们愿意,他们无论如何都会这样做。如果一个人下定决心要根据年龄限制注册是不可能的,而且由于您没有查看一些有关公民的政府数据库,因此这实际上不在您的职责范围内。只需简单的年龄检查即可。

我又想了想——如果你还想准确检查,你可以参考$this->input->post()回调函数中的每个字段。您甚至可以不带参数运行回调函数,因为您将绕过该限制。

于 2012-09-14T20:37:16.267 回答