You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:56:18