CodeIgniter:使用多个控制器时出现会话错误


CodeIgniter : Session error when using multiple controllers

当我想将代码划分到多个控制器中以创建一些结构时,我总是会遇到这个会话错误。我尝试了很多我在谷歌和stackoverflow上找到的东西,但都没有解决。这就是错误:

错误:

A PHP Error was encountered
Severity: Warning
Message: session_start(): Cannot send session cache limiter - headers already sent (output started at /Applications/MAMP/htdocs/BT_dashboard/application/controllers/Project.php:100)
Filename: Session/Session.php
Line Number: 140
Backtrace:
File: /Applications/MAMP/htdocs/BT_dashboard/application/controllers/Project.php
Line: 11
Function: __construct
File: /Applications/MAMP/htdocs/BT_dashboard/index.php
Line: 292
Function: require_once

我有我的"主"控制器User。我想添加一个控制器"项目"。当我打电话给项目管理员时,我得到了错误。这是用户控制器r:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * User class.
 * 
 * @extends CI_Controller
 */
class User extends CI_Controller {
    public function __construct() {
        parent::__construct();
        //$this->load->library(array('session'));
        $this->load->helper(array('url'));
        $this->load->model('user_model');
        $this->load->model('employee_model');
        $this->load->model('customer_model');
        $this->load->model('project_model');
    }
public function index() {
    if (!$this->session->userdata('userlevel')) {
        $this->load->view('dashboard_login');
    } else {
        $data['userdata'] = $this->session->userdata;
        $data['employeetotal'] = $this->user_model->get_amount_employees();
        $data['customertotal'] = $this->user_model->get_amount_customers();
        $data['projectstotal'] = $this->user_model->get_amount_projects();
        $this->load->view('header', $data);
        $this->load->view('dashboard_index', $data);
        $this->load->view('wrapper', $data);
    }
}
public function login() {
        $loggedin = $this->session->userdata('logged_in');
        if (!$loggedin) {
            $this->load->helper('form');
            $this->load->library('form_validation');
            $this->form_validation->set_rules('user_mail', 'user mail', 'required');
            $this->form_validation->set_rules('user_password', 'user password', 'required');
            if ($this->form_validation->run() == false) {
                $data = new stdClass();
                $data->error = 'Check your user and password';
                $this->load->view('dashboard_login', $data);
            } else {
                $usermail = $this->input->post('user_mail');
                $password = $this->input->post('user_password');
                if ($this->user_model->resolve_user_login($usermail, $password)) {
                    $user_id = $this->user_model->get_user_id_from_mail($usermail);
                    $user = $this->user_model->get_user($user_id);
                    $this->session->set_userdata('user_id', $user_id);
                    $this->session->set_userdata('user_name', (string) $user->user_name);
                    $this->session->set_userdata('user_gsm', (string) $user->user_gsm);
                    $this->session->set_userdata('user_address', (string) $user->user_address);
                    $this->session->set_userdata('user_city', (string) $user->user_city);
                    $this->session->set_userdata('userlevel', $this->user_model->get_user_level((int) $user->user_id));
                    $this->session->set_userdata('user_mail', $usermail);
                    /*
                      $_SESSION['user_id'] = $user_id;
                      $_SESSION['user_name'] = (string) $user->user_name;
                      $_SESSION['user_gsm'] = (string) $user->user_gsm;
                      $_SESSION['user_address'] = (string) $user->user_address;
                      $_SESSION['user_city'] = (string) $user->user_city;
                      $_SESSION['userlevel'] = $this->user_model->get_user_level((int) $user->user_id);
                      $_SESSION['user_mail'] = $usermail; */
                    $data['userdata'] = $this->session->userdata;
                    if ($this->session->userdata('userlevel') == "3") {
                        $data['employeetotal'] = $this->user_model->get_amount_employees();
                        $data['customertotal'] = $this->user_model->get_amount_customers();
                        $data['projectstotal'] = $this->user_model->get_amount_projects();
                    }
                    $this->load->view('header', $data);
                    $this->load->view('dashboard_index', $data);
                    $this->load->view('wrapper', $data);
                } else {
                    $data = new stdClass();
                    // login failed
                    $data->error = 'Wrong username or password.';
                    // send error to the view
                    $this->load->view('dashboard_login', $data);
                }
            }
        } else {
            $data['userdata'] = $this->session->userdata;
            $data['employeetotal'] = $this->user_model->get_amount_employees();
            $data['customertotal'] = $this->user_model->get_amount_customers();
            $data['projectstotal'] = $this->user_model->get_amount_projects();
            $this->load->view('header', $data);
            $this->load->view('dashboard_index', $data);
            $this->load->view('wrapper', $data);
        }
    }

我的项目管理员看起来像:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
 * File Name: employee.php
 */
class Project extends CI_Controller {
    public function __construct() {
        parent::__construct();
        //$this->load->library(array('session'));
        $this->load->helper(array('url'));
        $this->load->model('user_model');
        $this->load->model('employee_model');
        $this->load->model('customer_model');
    }
    public function createProject() {
        if ($this->session->userdata('userlevel')) {
            if ($this->session->userdata('userlevel') < 3) {
                $userid = $this->uri->segment(3);
            } else {
                $userid = $this->input->post('userproject');
            }
            $this->load->helper('form');
            $this->load->library('form_validation');
            $this->form_validation->set_rules('project_name', 'project name', 'trim|required|min_length[2]|callback_is_project_name_unique[' . $this->input->post('project_name') . ']');
            $this->form_validation->set_rules('project_address', 'project address', 'trim|required|min_length[2]');
            $this->form_validation->set_rules('project_description', 'project description', 'trim|required|min_length[2]');
            $this->form_validation->set_rules('project_city', 'project city', 'trim|required|min_length[2]');
            if ($this->form_validation->run() == FALSE) {
                $data['userdata'] = $this->session->userdata;
                $this->load->view('header', $data);
                if ($this->session->userdata('userlevel') < 3) {
                    $this->load->view('dashboard_add_project', $data);
                } else {
                    $data['userslist'] = $this->user_model->get_users_list();
                    $this->load->view('dashboard_add_project_admin', $data);
                }
                $this->load->view('wrapper', $data);
            } else {
                $Address = urlencode($this->input->post('project_address'));
                $request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" . $Address . "&sensor=true";
                $xml = simplexml_load_file($request_url) or die("url not loading");
                $status = $xml->status;
                if ($status == "OK") {
                    $Lat = $xml->result->geometry->location->lat;
                    $Lon = $xml->result->geometry->location->lng;
                    $LatLng = "$Lat,$Lon";
                }
//pass validation
                $data = array(
                    'project_name' => $this->input->post('project_name'),
                    'project_address' => $this->input->post('project_address'),
                    'project_description' => $this->input->post('project_description'),
                    'project_city' => $this->input->post('project_city'),
                    'project_finished' => $this->input->post('project_finished'),
                    'lat' => $Lat,
                    'lng' => $Lon,
                );
//$this->db->insert('tbl_user', $data);
                if ($this->user_model->create_project($data, $userid, $this->input->post('project_name'))) {
                    if ($this->session->userdata('userlevel') > 1) {
                        $data['projectlist'] = $this->user_model->get_project_list();
                        $data['uncompleted_projects'] = $this->user_model->get_uncompleted_projects();
                        $data['completed_projects'] = $this->user_model->get_completed_projects();
                    } else {
                        $data['projectlist'] = $this->user_model->get_project_list_userid($userid);
                    }
                    $data['userdata'] = $this->session->userdata;
                    $this->load->view('header', $data);
                    $this->load->view('dashboard_projects', $data);
                    $this->load->view('wrapper', $data);
                } else {
                    $data->error = 'There was a problem creating your new employee. Please try again.';
                    $data['userdata'] = $this->session->userdata;
                    // send error to the view
                    $this->load->view('header', $data);
                    $this->load->view('dashboard_add_project', $data);
                    $this->load->view('wrapper', $data);
                }
            }
        }
    }
}
?>

我的config/autoload.php得到以下代码行:

$autoload['libraries'] = array('database','session');

在codeigniter中,我认为框架是在你的控制器后面添加php,用?>退出你的控制器,您可以使附加的任何内容看起来像hmtl,并支持其进行响应。

由于不能在向客户端发送返回(this->load->view())后直接发送html,因此会出现此错误。

不要使用?>退出控制器