PHP需要建议更好的方法CodeIgniter Framework

时间:2015-07-09 01:53:05

标签: php codeigniter session-cookies

我正在使用带有2个控制器的CI框架构建网络应用程序'仪表板'和仪表板控制器中的'项目',我有用于获取项目列表的脚本:

(仪表板控制器)

class Dashboard extends MY_Controller {

    function __contruct()
    {
        parent::__contruct()
        $project_id = array('projectid' = '');

        // remove project id session userdata
        $this->session->unset_userdata($project_id);
    }

    function index()
    {
        $this->load->model("content_model");

        // getting project list
        $this->data['projects'] = $this->content_model->get_content();

        // rendering view
        $this->_render_page('dashboard/index', $this->data);
    }
}

(仪表板索引视图)

<html>
<?php foreach ($projects as $project):?>
    <?php echo anchor("projects/index/".$project->id, 'Project', 'title="List Project"');?>
<?php endforeach;?>
</html>

上面的脚本将生成一个指向我的项目控制器的链接,如下所示:

<a href="http://me.com/projects/index/1" title="List Project">Project</a>
<a href="http://me.com/projects/index/2" title="List Project">Project</a>
<a href="http://me.com/projects/index/3" title="List Project">Project</a>

上面链接中的数字1,2,3 ..等等是项目的ID,所以在第二个控制器(我称之为项目控制器)中,我将这个id设置为session userdata:

(项目管理员)

class Projects extends MY_Controller {

    function __construct()
    {
        parent::__construct();
        $this->load->model("project_model");
    }

    function index($projectid = NULL)
    {
        // checking for id
        if ($projectid !== null && !is_numeric($projectid))
        {
            header("refresh:4;url=".base_url('dashboard'));
            return show_404();
        }

        // set project ids to session userdata
        $ses = array('projectid' => $projectid);
        $this->session->set_userdata($ses);

        // querying get data of project
        $this->project_model->data_project($projectid);
    }

    // add goods to project
    function add_goods()
    {
        // get project id from session
        $projectid = $this->session->userdata('projectid');

        // get input form value
        $form_data = array(
            'name'   => $this->input->post('name'),
            'qty' => $this->input->post('qty'),
            'note'  => $this->input->post('note'),
        );

        // querying save goods to related project
        $this->project_model->add_goods_project($projectid, $form_data);

        // redirect
        redirect('projects/goods', 'refresh');
    }

    // remove goods from project
    function remove_goods($goodid=false)
    {
        // get project id from session
        $projectid  = $this->session->userdata('projectid');

        // querying remove goods from related project
        $this->project_model->remove_goods_project($projectid, $goodid);

        // redirect
        redirect('projects/goods', 'refresh');
    }
}

将项目ID设置为会话用户数据后,我很容易从数据库中查询与数据相关的项目。

// get project id from session
$projectid = $this->session->userdata('projectid');

// querying save goods to related project
$this->project_model->add_goods_project($projectid, $form_data);

// querying remove goods from related project
$this->project_model->remove_goods_project($projectid, $goodid);

但毕竟我认为如果用户在不同的标签中打开多个项目链接,这种方法将无效,它将搞乱所有查询数据库。由于会话数据只有1个项目ID。

我需要有人建议我(建议)一个更好的方法,以便用户可以享受开放的多个项目吗?

由于

1 个答案:

答案 0 :(得分:2)

使用基于cookie的会话管理,浏览器一次只能支持一个会话。这适用于绝大多数网站。要在一个浏览器中支持多个会话,您需要使用基于URL的会话管理,这非常棘手且容易出错。

您只需要正确配置它:

  • cookie名称中没有下划线
  • cookie主机名和路径必须正确
  • hostname需要有效(需要一个,在某些情况下名称中有两个点,因此localhost无效!)
  • 确保服务器上的时间正确(ntp)
  • 使用超时时,为不同时区的用户提供服务
  • 使用超时时,为不正确设置PC时钟的用户提供服务
  • 使用ajax时,请避免对ajax请求进行sess_update()调用(在论坛中搜索解决方案)

当使用无法发送cookie的客户端解决方案(p.e. swf)时,让它将session_id作为post变量发送。然后扩展会话库,以便在无法找到cookie时通过$ this-&gt; input-&gt; post()检查此变量,并使用它来加载会话。

希望这个想法有助于:-)