如何在用户登录时将非发布数据发布到会话中

时间:2010-12-31 14:53:08

标签: php mysql class codeigniter methods

当我的用户登录网站时,会话数据中缺少他们的名字,姓氏和ID,因为我的会话数据被编码为接收数据并提交到我的数据库中的会话表中。

由于用户只在我的会话数据中使用电子邮件和密码登录,因此只会显示电子邮件,而其他任何内容都没有。

如何在我的数据库中的会话表中显示名字,姓氏和ID?我想知道如何在用户登录时从数据库中获取这些详细信息,并在我的$ u_data数组中提供它,以便获得上传登录成功。

这是我的代码:

<?php
class Login_Model extends CI_Model {


    public function checkLogin() {

            $this->db->where('email', $this->input->post('email')); //compare db email to email entered in form
            $this->db->where('password', $this->hashed()); //compare db password to hashed user password
            $query = $this->db->get('users'); //get the above info from 'user' table

            if ($query->num_rows() == 1) { //if number of rows returned is 1

            $u_data = array( //new variable with session data
                'user_id' => $this->db->insert_id(),
                'email' => $this->input->post('email'),
                'first_name' => $this->input->post('first_name'),
                'last_name' => $this->input->post('last_name'),
                'logged_in' => TRUE
            );

            $this->session->set_userdata($u_data); //send data from variable to db session
            return TRUE;

       } else {
            return FALSE;
       }
 }


   public function hashed() { //hashing method

            // sha1 and salt password
            $password = $this->encrypt->sha1($this->input->post('password')); //encrypt user password
            $salt = $this->config->item('encryption_key'); //grab static salt from config file

            $start_hash = sha1($salt . $password);
            $end_hash = sha1($password . $salt);
            $hashed = sha1($start_hash . $password . $end_hash);
            return $hashed;
}

}

alt text

4 个答案:

答案 0 :(得分:1)

这就像做一样简单:

session_start();
$_SESSION['userdata'] = $u_data;
在您的CheckLogin方法中

。会话只是一个常规的PHP数组,碰巧会自动为您保留。你可以把任何你想要的东西放进去,但你确实自己把东西放进去 - PHP不会为你做。

评论后续:

疑难杂症。因此,您只需修改您的类,以便在登录验证后从数据库中获取该信息。我不知道你的数据库类是如何工作的,但不是仅仅检查是否有匹配的行,而是使用类似这样的查询来获取名/姓:

select firstname, lastname
from users
where email=$email and password=$password

如果您获得结果行,您知道它是有效的登录名,然后您只需检索名称数据。我不知道你的db类是如何工作的,但是要做到这一点并不是太难。

答案 1 :(得分:1)

如果您正在跟踪数据库中的会话,则会想到两个解决方案。

首先,您可以从用户表中选择第一个/最后一个并将其插入到会话表中。这需要更改您的应用程序。

其次,您可以为您的应用程序设置一个视图,其中会话表自动与相应的用户连接,但是假设您已经拥有了一个唯一的标识符,用于它在会话中的用户(就是电子邮件)地址?*)。此解决方案不需要对应用程序代码进行任何更改,但需要更改数据库,这可能是首选方法,具体取决于您的部署要求(或者可能不是:))。

*作为附注,如果您使用电子邮件地址获取唯一标识符,请注意有些人在您决定是否适合您时,共享电子邮件地址。

答案 2 :(得分:1)

当我在CodeIgniter中使用Auth系统时,我已经通过在构造函数中获取userdata来实现在视图中全局包含“user”对象,并在全局控制器中包含“user”对象,如此...

<?php

class My_Controller extends Controller {

    private $the_user;  //global var to store current user data

    function My_Controller() {
        parent::Controller();

        $data->the_user = $this->ion_auth->get_user();       //get user data
        $this->load->vars($data);                  //load into all views as $the_user "$the_user"
        $this->the_user=$data->the_user;         //load into private class variable "$this->the_user"
    }

此时,默认情况下,$ the_user变量对象在所有视图中都可用。$ this-&gt; the_user始终可用于控制器功能。它始终代表当前登录的用户。

我正在使用Ion_auth进行身份验证并获取用户,因此您需要填写该部分。

我实际上只是constructed a "How-to"来实现扩展的Controller类,所以所有Auth逻辑都会自动继承到所有“受保护”的控制器。

答案 3 :(得分:0)

以下为我解决了这个问题。我在这里查看了一个旧的问题并使用了我的常识。

我对我的代码进行了编辑。

if ($query->num_rows() == 1) { //if number of rows returned is 1

      $user = $query->result();

                $u_data = array( //new variable with session data
                    'user_id' => $user[0]->id,
                    'email' => $this->input->post('email'),
                    'first_name' => $user[0]->first_name,
                    'last_name' => $user[0]->last_name,
                    'logged_in' => TRUE
                );