J'ai créé une page de connexion avec codeigniter, mais je reçois le message php.
Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time
comment régler ceci?
view (login.php)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Admin Login</title>
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/admin-style.css">
</head>
<body>
<?php echo form_open('Verify_login', ['id'=>'loginForm', 'name'=>'loginForm', 'method'=>'post']) ?>
<div class="login">
<div class="log-box">
<h3>Login</h3>
<div >
<input id="username" name="username" placeholder="User Name" value="" type="text" >
<?php echo form_error('username'); ?>
<input id="Password" name="password" placeholder="Password" required type="password">
<?php echo form_error('password'); ?>
<div class="remember-me">
<input id="checkBox" type="checkbox">
<label for="checkBox">Remember Me</label>
</div>
<button class="login-button" name="loginButton">Login</button>
</div>
</div>
</div>
</form>
</body>
</html>
contrôleur (Verify_login.php)
<?php
defined('BASEPATH') OR exit('No direct script access aloowed');
class Verify_login extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('User');
$this->load->helper('url');
$this->load->helper('security');
$this->load->library('form_validation');
$this->load->library('session');
}
public function index()
{
$this->form_validation->set_rules('username', 'Username', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required|callback_check_database');
if ($this->form_validation->run() == FALSE) {
// if validation failed load the view
$this->load->view('admin/login');
}
else{
$this->check_database($username , $password);
redirect('dashboard', 'refresh');
}
}
public function check_database($password)
{
$username = $this->input->post('username');
//query tha database
$result = $this->User->login($username, $password);
if ($result) {
$sess_array = [];
foreach ($result as $row) {
$sess_array =
[
'id'=>$row->id,
'username'=>$row->name
];
$this->session->set_userdata('logged_in', $sess_array);
}
return TRUE;
}
else{
$this->form_validation->set_message('check_database','invalid username and password');
}
}
}
?>
contrôleur (Admin.php)
session_start(); //need to call PHP's session object to access it though it
class Admin extends CI_Controller
{
public $data;
public function __construct()
{
parent::__construct();
$this->load->helper('url');
$this->load->helper('form');
$this->load->helper('url');
$this->load->library('form_validation');
$this->load->helper('security');
//load user model
$this->load->model('User');
}
public function index()
{
// $this->load->view('admin/index');
if ($this->session->userdata('logged_in')) {
$session_data = $this->session->userdata('logged_in');
$data['username'] = $session_data['name'];
$this->load->view('admin/dashboard', $data);
}
else{
//if no session redirect to login page
redirect('admin', 'refresh');
// redirect('login');
}
}
public function logout()
{
$this->session->unset_userdata('logged_in');
session_destroy();
redirect('home', 'refresh');
}
model (User.php)
<?php
/ ** * Classe de connexion utilisateur qui étend MY_Model * * /
defined('BASEPATH') OR exit('no direct script allowed');
class User extends CI_Model
{
protected $table = 'users';
public function __construct()
{
$this->load->database();
}
public function login($username ,$password)
{
var_dump($username);
var_dump($password);
$this->db->select(['id', 'name', 'password']);
$this->db->from($this->table);
// $this->db->where('name', $username);
// $this->db->where('password', $password);
$this->db->limit(1);
$query = $this->db->get();
if ($query->num_rows() == 1) {
return $query->result();
}
else{
return false;
}
}
}
?>
Je pense que vous êtes débutant dans le concept-cadre et la programmation orientée objet.
Vous n'avez pas besoin de cette ligne dans admin.php
session_start(); //need to call PHP's session object to access it though it
Lorsque vous chargez la bibliothèque de session, son constructeur le fait pour vous.
Le message signifie que vous avez démarré une session avec session_start()
dans laquelle, dans le code, vous utilisez ini_set()
pour manipuler le module de session. Si vous manipulez le module de session, vous devez le faire avant le démarrage et l’activation d’une session.
Message: ini_set (): une session est active. Vous ne pouvez pas modifier les paramètres ini du module de session pour le moment
J'ai eu le même message d'erreur il y a quelque temps. Par défaut, Code-igniter écrit dans le fichier (C:\xampp\tmp) dans mon cas. Mais je veux qu'il écrive dans la base de données à la place.
Dans votre autochargeur, vous avez peut-être eu quelque chose comme ça:
//:::::$autoload['libraries'] = array();
//'session', this mean start session ini_set()
$autoload['libraries'] = array('session', 'database');
Par défaut, le paramétrage de la session config/config.php ressemble à ceci:
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
La documentation a indiqué que pour utiliser la base de données au lieu d'un fichier, vous devez d'abord créer une table dans la base de données de l'application.
CREATE TABLE IF NOT EXISTS `ci_sessions` (
`id` varchar(128) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
`data` blob NOT NULL,
KEY `ci_sessions_timestamp` (`timestamp`)
);
Retournez à la config/config.php et remplacez $config['sess_driver'] = 'files';
par $config['sess_driver'] = 'database';
Je pensais que tout allait bien se passer mais j’ai eu l’erreur Message: ini_set (): Une session est active. Vous ne pouvez pas modifier les paramètres ini du module de session pour le moment
Ma solution consistait à exécuter d'abord la session_destroy();
Puis changez le nom de la session et le nom de la table
Ma configuration ressemble à ceci:
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'newname_session';
$config['sess_expiration'] = 72000;
$config['sess_save_path'] ='newname_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
Tout enregistrer et après avoir rafraîchi la page tout effacée, aucun message d'erreur ne s'affiche