如何在Controller内部实现方法间变量传递并通过Model入库?
解决CodeIgniter中跨Controller方法传递Facebook用户数据的问题
嘿,我来帮你搞定这个问题!在CodeIgniter里,跨方法传递数据最靠谱的方式就是用Session——它能在用户会话期间持久保存数据,刚好适配你这种从Facebook登录页到密码设置页的场景。下面是具体的实现步骤:
第一步:在web_login方法中存储Facebook用户数据到Session
首先要确保CodeIgniter的Session库已加载(如果没在config/autoload.php里配置自动加载,就手动在方法里加载)。拿到Facebook用户数据后,把它存入Session:
public function web_login() { $data['user'] = array(); // 手动加载Session库(若已自动加载可省略) $this->load->library('session'); if ($this->facebook->is_authenticated()) { $user = $this->facebook->request('get', '/me?fields=id,name,email'); if (!isset($user['error'])) { $data['user'] = $user; // 将Facebook用户数据存入Session,键名自定义即可 $this->session->set_userdata('fb_user', $user); $this->load->view('user/header'); $this->load->view('user/fbpass'); $this->load->view('user/footer'); } else { $this->load->view('user/register'); } } }
第二步:在getpass方法中取出Session数据并与密码一起存入数据库
在密码验证通过后,从Session中取出之前存储的Facebook用户数据,和表单提交的密码组合后传给Model:
public function getpass(){ $this->load->model('user_model', 'auth'); $this->load->view('user/header'); $this->load->library('form_validation'); // 手动加载Session库(若已自动加载可省略) $this->load->library('session'); $this->form_validation->set_rules('password', 'Password', 'required'); $this->form_validation->set_rules('passwordagain', 'Password Confirmation', 'required|matches[password]'); if ($this->form_validation->run() == FALSE) { $this->load->view('user/fbpass'); } else { $password = $this->input->post('password'); // 从Session中取出Facebook用户数据 $fb_user = $this->session->userdata('fb_user'); // 先检查Session数据是否存在,避免空数据入库 if (!empty($fb_user)) { // 组装要存入数据库的数据数组 $user_data = array( 'fb_id' => $fb_user['id'], 'name' => $fb_user['name'], 'email' => $fb_user['email'], 'password' => password_hash($password, PASSWORD_DEFAULT) // 关键:密码必须加密存储! ); // 调用Model的方法完成数据库插入 $this->auth->save_user($user_data); // 插入成功后可跳转至用户首页等页面 redirect('user/dashboard'); } else { // 若Session中无数据,说明用户未走Facebook登录流程,跳转至登录页 redirect('user/web_login'); } } }
第三步:在Model中实现数据存储方法
最后在user_model里添加一个处理插入逻辑的方法:
public function save_user($user_data) { // 假设你的用户表名为`users`,字段与上面数组的键对应 return $this->db->insert('users', $user_data); }
额外小提醒
- 记得在
config/config.php里正确配置Session的保存路径,确保Session功能正常运行; - 永远不要明文存储密码,用
password_hash加密是安全底线; - 可以给
getpass方法加一些友好的错误提示,比如Session过期时告知用户重新登录。
内容的提问来源于stack exchange,提问作者user10768139
相关产品推荐
相关产品推荐

