CodeIgniter:TankAuth,检查用户出生日期作为回调

时间:2012-09-14 19:07:15

标签: php codeigniter tankauth

好的,所以我已经在用户注册中实现了出生日期。我现在要做的就是在出生日期之前检查一下他们是否超过一定年龄(13岁)才能注册。他们我做DOB的方式有点奇怪,但它确实有效。我有3个字段dob1,dob2,dob3。 CodeIgniter: Tank Auth, Adding Date of Birth Issues以下是我如何实施它,如果有人感兴趣的话。无论如何,这是我到目前为止所尝试的:编辑:用户输入的语法是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]');

我关门了吗?我离开了吗?有人帮吗?现在它所做的就是假装我从未创建过这个回调并且即使用户太年轻也会让用户进入。我知道它正在调用函数,因为我对变量有一些问题。帮助

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

//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[]');

1 个答案:

答案 0 :(得分: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()。你甚至可以在没有参数的情况下运行回调函数,因为你将绕过这个限制。