【问题标题】:How do I store a form data into a Codeigniter session?如何将表单数据存储到 Codeigniter 会话中?
【发布时间】:2015-06-26 22:32:13
【问题描述】:

如何将表单中的数据数组()存储到 Codeigniter 中的会话中?

我想存储电子邮件数据,以便在模型的帮助下使用它从数据库中检索名字。

以下是我的代码,我无法正常工作:

    public function index()
    {

        if (isset($this->session->userdata['logged_in'])) {

            redirect('admin_panel');
        }

        $this->load->library('form_validation');
        $this->form_validation->set_rules('email_address', 'Email Address', 'required|valid_email');
        $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');

        if ($this->form_validation->run() !== false) {
            $this->load->model('admin_model');
            // then validation passed . Get data from the base
            $res = $this->admin_model->verify_user($this->input->post('email_address'), $this->input->post('password'));

            if ($res !== false) {
                // person has an account

                $session_data = array(
'id' => $row[0]->id,
'email' => $row[0]->email_address,
);
// Add user data in session
$this->session->set_userdata('logged_in', $session_data);

                redirect('admin_panel');
            }

很高兴知道这样做的正确方法。我对 Codeigniter 还很陌生,最近才熟悉 MVC。


我很抱歉没有提供足够的细节。我只发布了部分代码。我只对如何将登录表单数据存储到会话中以及如何检索它感兴趣。

下面是控制器的完整代码——nxlogin.php

    <?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Nxlogin extends CI_Controller {

                function __contruct()
                {
                    parent::__contruct();
                    session_start();
                }

    public function index()
    {

        if (isset($this->session->userdata['logged_in'])) {

            redirect('admin_panel');
        }

        $this->load->library('form_validation');
        $this->form_validation->set_rules('email_address', 'Email Address', 'required|valid_email');
        $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');

        if ($this->form_validation->run() !== false) {
            $this->load->model('admin_model');
            // then validation passed . Get data from the base
            $res = $this->admin_model->verify_user($this->input->post('email_address'), $this->input->post('password'));

            if ($res !== false) {
                // person has an account

                $session_data = array(
'id' => $row[0]->id,
'email' => $row[0]->email_address,
);
// Add user data in session
$this->session->set_userdata('logged_in', $session_data);


                redirect('admin_panel');
            }


        }

        $this->load->view('login_view');
    }

    public function logout()
    {
         $sess_array = array(
        'id' => '',
        'email' => ''
        );
        $this->session->unset_userdata('logged_in', $sess_array);

        redirect('nxlogin');
    }
}

这是我的模型 - admin_model.php

    <?php


class Admin_model extends CI_Model {

    function __construct()

    {

    }

    public function verify_user($email, $password)

    {

          $q = $this->db->where('email_address', $email)->where('password', sha1($password))->limit(1)->get('adminusers');

          if ($q->num_rows > 0) {

            return $q->row();
          }
          return false;

    }

    public function get_data($id)

    {

          $q = $this->db->get_where('adminusers', array('id' => $id));

          if ($q->num_rows > 0) {

            return $q->result();
          }
          return false;
    }
}

现在我要做的是将电子邮件存储到会话数组中,然后在 admin_panel.php-控制器中使用它从具有该电子邮件的特定数据库行中检索数据(如全名);这是管理主页。代码是:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Admin_panel extends CI_Controller {

    public function __construct()
    {

      session_start();
      parent::__construct();


    if (!isset($this->session->userdata['logged_in'])) {

        redirect('nxlogin');
      }
    }

  public function index()
  {
    $this->load->view('admin_panel');
  }

  public function profile()
  {

       if (isset($this->session->userdata['logged_in']))
       {

     $id = isset($this->session->userdata['logged_in']) ;
    $this->load->model('admin_model');

    $data['query'] = $this->admin_model->get_data($id);

    $this->load->view('profile', $data);
  }
  }
}

我还看到您在将信息存储到会话数组时使用了此代码 -

$session_data = array(
        'id' => $row[0]->id,
        'email' => $row[0]->email_address,
        );

为什么两者都是 $row[0]?

【问题讨论】:

    标签: php codeigniter session


    【解决方案1】:

    发现了一些问题。

    first. 在您的模型 verify_user() 方法中,您将返回 row() CI docs here 显示 row() 返回一个包含第一个结果的对象。

    second. 在你的 Nxlogin 控制器 index() 方法中,你的 row() 被加载到 $res 中,但是你引用了不正确的 row[0]。参考你的结果,比如 $res-&gt;id$res-&gt;email_address

    第三个。你应该初始化你的会话 $this-&gt;load-&gt;library('session'); 在您的控制器构造函数中,并将其放置在 parent::__construct(); 之后,如文档中的 here 所示,您在 Admin_panel 控制器中将其混合在一起。或使用auto-loaded

    第四次。您已经根据会话中的键加载了数组。两个选项,(1)您应该在您的 Admin_panel 配置文件方法中使用 $id['id'] 调用 get_data。或(2)在没有密钥的情况下加载您的数组。 Nxlogin index() 将 $this-&gt;session-&gt;set_userdata('logged_in', $session_data); 更改为 $this-&gt;session-&gt;set_userdata($session_data); 现在使用 $this-&gt;session-&gt;userdata['id']$this-&gt;session-&gt;userdata['email'] 引用您的数据,它们认为您在追求什么。

    last. 还请考虑遵循 codeigniters 样式指南 here,因为为清楚起见,您的 false 应为大写。

    祝你好运!

    【讨论】:

    • 我正在使用 codeignitor 2.2 版。我知道 3 中的情况有些不同,我正在考虑升级或迁移到 laravel。多谢。不过很有帮助。
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多