Ich habe eine Anmeldeseite mit Codeigniter erstellt, erhalte aber die PHP-Nachricht.
Message: ini_set(): A session is active. You cannot change the session module's ini settings at this time
wie kann man das beheben?
Ansicht (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>
controller (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');
}
}
}
?>
controller (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
/ ** * Benutzeranmeldungsklausel, die MY_Model erweitert * * /
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;
}
}
}
?>
Ich denke, Sie sind Neuling im Rahmenkonzept und in OOP.
Sie brauchen diese Zeile nicht in admin.php
session_start(); //need to call PHP's session object to access it though it
Wenn Sie die Sitzungsbibliothek laden, erledigt der Konstruktor dies für Sie.
Die Nachricht bedeutet, dass Sie eine Sitzung mit session_start()
gestartet haben, in der Sie im Code weiter unten ini_set()
verwenden, um das Sitzungsmodul zu bearbeiten. Wenn Sie das Sitzungsmodul bearbeiten, sollten Sie dies vor dem Start und der Aktivierung einer Sitzung tun.
Message: ini_set (): Eine Sitzung ist aktiv. Sie können die Ini-Einstellungen des Sitzungsmoduls derzeit nicht ändern.
Ich hatte dieselbe Fehlermeldung vor einiger Zeit. Standardmäßig schreibt Code-Igniter in die Datei (C:\xampp\tmp). Aber ich möchte, dass es stattdessen in die Datenbank schreibt.
In Ihrem Autoloader haben Sie vielleicht so etwas gehabt:
//:::::$autoload['libraries'] = array();
//'session', this mean start session ini_set()
$autoload['libraries'] = array('session', 'database');
Die Standardeinstellung in der Konfigurationsdatei config/config.php sieht folgendermaßen aus:
$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;
Die documentation gab an, dass Sie zur Verwendung einer Datenbank anstelle einer Datei zunächst eine Tabelle in der Anwendungsdatenbank erstellen sollten.
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`)
);
Gehen Sie zurück zu config/config.php und ändern Sie $config['sess_driver'] = 'files';
in $config['sess_driver'] = 'database';
.
So dachte ich, dass alles in Ordnung sein sollte, aber ich habe den Fehler Nachricht: ini_set (): Eine Sitzung ist aktiv. Sie können die Ini-Einstellungen des Sitzungsmoduls derzeit nicht ändern.
Meine Lösung bestand darin, zuerst die session_destroy();
auszuführen.
Ändern Sie dann den Sitzungsnamen und den Tabellennamen
Meine Konfiguration sieht so aus:
$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;
Alles speichern und die Seite nach dem Aktualisieren gelöscht, keine Fehlermeldung mit