注册电子邮件激活确认问题。即使连接,电子邮件URL中也缺少激活码字符串

时间:2010-12-30 11:19:01

标签: php mysql variables codeigniter methods

我有这个方法:

public function activation_code() 
{ //activation code sent into db
  $activation_code = random_string('alnum', 32);
  return $activation_code;
}  

我要做的是为此提供发送到我的数据库的帖子数据,但也提供相同激活码的副本,以便我可以将其与“点击此处确认电子邮件”网址连接,即在我的注册时发送给用户的确认电子邮件中。

我该怎么做?我无法提供该方法,因为如果我执行数据库代码并且电子邮件URL代码将不同,那么用户将无法匹配它们并确认其电子邮件地址。

我尝试了许多其他方法,例如在一个地方提供方法,例如

public function create() 
{ //get post data and insert into db

  $dbcolumn->group_id = 2; //group 1 for admin group 2 for member
  $dbcolumn->first_name = $this->input->post('first_name');
  $dbcolumn->last_name = $this->input->post('last_name');
  $dbcolumn->email = $this->input->post('email');
  $dbcolumn->password = $this->hashed();
  $dbcolumn->birthday = $this->input->post('year') . 
    '-' . $this->input->post('month') . '-' . $this->input->post('day');
  $dbcolumn->sex = $this->input->post('sex');       
  $dbcolumn->activation_code = $this->activation_code();
  // date and time user joined the website
  $dbcolumn->created_on = date('Y-m-d H:i:s', now()); 
  $this->db->insert('users', $dbcolumn);
}

如果查看dbcolumn->激活代码行,您将看到我所做的事情。这有效,代码存储在数据库中。如果我向发送的电子邮件提供相同的“$ this-> activation_code()方法,则代码显然会有所不同。

public function send_confirmation_email() 
{ //receives variable from create method
  $this->load->library('email');
  $this->email->from('wengerarsen@gmail.com', 'my site');
  $this->email->to($this->input->post('email'));
  $this->email->subject('my site - Activate your account');
  //copy of activation code returned from create method
  $this->email->message('We\'re back, please click the link to activate your account ' . anchor('http://mysite.com/activation/' . $this->activation_code(), 'Activate my account'));
  $this->email->send();
}

正如您所看到的,我将相同的方法$ activation_code()拉入我的发送确认电子邮件方法。这将生成一个全新的代码,这意味着我将无法匹配用户电子邮件中的数据库激活代码和URI段代码。

我试图在return public中创建变量并在send confirmaton电子邮件方法中调用它,但它不起作用。从电子邮件中的URL末尾开始,代码最终丢失。

我尝试了很多不同的方式而不是工作。

也许我在这里遗漏了什么?

建议,例子等将不胜感激。

1 个答案:

答案 0 :(得分:0)

每次您致电activation_code()时,您都会创建新代码,因为您只会将其存储在该功能的范围内。

更好的想法是将其存储为对象属性,如下所示:

public var $_activation_code = null;

public function activation_code() {
    if (is_null($this->_activation_code)) {
        $this->_activation_code = random_string('alnum', 32);
    }
    return $this->_activation_code;
}

这将创建代码,如果它还没有为此对象完成,或者只是在方法被多次调用时返回当前代码,这意味着代码将在整个对象中保持一致。