Ich bin seit gestern mit diesem Problem konfrontiert und konnte es dennoch nicht lösen. Das Problem ist, dass Sitzungen nicht in der lokalen Umgebung funktionieren, aber wenn ich zu Testzwecken dieselben Dateien auf einen Live-Server stelle, funktionieren sie einwandfrei.
Hier, wenn meine config.php Datei:
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
So speichere ich die Daten in einer meiner Modelldateien
$this->session->set_userdata('user',$result); //$result works fine, it produces
right result
Ich habe aus meiner Sicht versucht, darauf zuzugreifen:
$this->session->userdata['user']['name']; //name here is an element in result array
Ich erhalte diesen Fehler:
Schweregrad: Hinweis
Nachricht: Undefinierter Index: Benutzer
Dateiname: home/home.php
Zeilennummer: 2
Zu meiner Überraschung läuft der gleiche Code ohne Fehler auf dem Server.
Auch, um die von Codeigniter-Sitzungen gespeicherten Daten zu erfahren, habe ich die Datenbankmethode ausprobiert.
Ich habe den Code in config.php geändert
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
Anstatt eine Datenzeile einzufügen, werden vier eingefügt. Unten sehen Sie einen Screenshot aus der Datenbank (letzte vier Zeilen).
Kann jemand auf den Fehler verweisen? Jede Hilfe wird geschätzt.
Deine Frage hat ein paar Teile, ich werde sie nacheinander beantworten.
userdata()
ist eine Methode. Die Art und Weise, wie Sie darauf zugreifen, behandelt es als Array:
$this->session->userdata['user']['name']; // Bad
Wie die Dokumente beschreiben, sollten Sie den Schlüssel des Werts, den Sie als Parameter abrufen möchten, an die userdata
-Methode übergeben:
$user = $this->session->userdata('user');
// Now you can echo $user['name'];
Noch einfacher ist die Verwendung der neueren Syntax:
$user = $this->session->user;
// Now you can echo $user['name'];
Überprüfen Sie die timestamp
-Felder. Sie zeigen 3 verschiedene Zeiten, dh es handelt sich um 3 separate Ereignisse auf der Website. Der erste tritt bei 1501911275
auf, dann sind 6 Sekunden später noch 2 Datensätze vorhanden, und 139 Sekunden später der letzte Datensatz. Diese stellen 3 separate Anforderungen an die Site dar - wahrscheinlich haben Sie verschiedene Seiten besucht oder getestet und neu geladen.
Bei why gibt es mehrere Datensätze, da die Sitzungs-ID regelmäßig neu generiert wird. Wie oft dies geschieht, hängt von Ihrer Konfiguration ab. Siehe die Option sess_time_to_update
config. Wie oft sie zerstört werden, hängt auch von Ihrer Konfiguration ab (siehe sess_regenerate_destroy
im selben Abschnitt der Dokumente). Normalerweise bleiben ältere Sitzungsaufzeichnungen jedoch eine Zeit lang erhalten und werden später durch die Garbage Collection aufgeräumt. Während Sie also nur 1 "aktuelle" Sitzungsaufzeichnung haben, können alte Aufzeichnungen eine Weile bestehen bleiben.
sess_save_path
Aus dem Wortlaut Ihrer Frage möchte ich, dass Sie den files
-Sitzungstreiber verwenden möchten, und nur den database
-Treiber zum Testen ausprobiert hat. Wenn dies der Fall ist, liegt in der Dateisitzungskonfiguration ein Problem vor, das Sie beheben sollten.
für $ config ['sess_save_path'] werden nur absolute Pfade unterstützt.
Die Kommentare in config/config.php
sagen auch:
WARNUNG: Es werden nur absolute Pfade unterstützt!
Ihre Konfiguration legt fest, dass die Sitzungsdaten in ci_sessions
gespeichert werden sollen. Dies ist kein absoluter Pfad:
$config['sess_save_path'] = 'ci_sessions'; // Bad
Ich bin nicht sicher, wie das interpretiert wird, aber ich schätze, dass das Verzeichnis nicht existiert und der Webserver keine Berechtigungen zum Erstellen hat. Ich kann mir nicht vorstellen, warum es auf Ihrem Live-Server funktioniert.
Ändern Sie den Pfad in einen absoluten Pfad und stellen Sie sicher, dass Ihr Webserver darauf schreiben kann. Wieder aus den Dokumenten
mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/
(Ändern Sie www-data
in den Benutzer, unter dem Ihr Webserver ausgeführt wird). Und dann:
$config['sess_save_path'] = '/<path to your application directory>/sessions/';
Wenn Sie die Codeigniter Class Referencesetuserdata
lesen, wird erwartet, dass das zweite Argument ein Wert ist, falls das erste Argument ein Schlüssel ist, daher der Fehler.
mit dem Codeigniter können Sie nicht das erreichen, was Sie wollen, wie es verwendet wird:
set wie folgt:
$result=array('name'=>'john doe');
$this->session->set_userdata($result);
oder $this->session->set_userdata('name','john doe');
get so:
echo $this->session->userdata(['name']);
auf der anderen Seite können Sie mit Vanilla php $_SESSION
Folgendes erreichen:
set: $_SESSION['user']=$result;
get: echo $_SESSION['user']['name'];
siehe über $ _SESSION bei PHP-Handbuch
Anmerkung:
Zu meiner Überraschung wird derselbe Code ohne Fehler auf dem Server ausgeführt.
dies liegt an Ihrer ENVIRONMENT
-Einstellung, da Sie error_reporting
auf dem Produktionsserver (live) beschränkt haben. Dies ist in Ihrem Root festgelegt index.php
.
ändern Sie define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
zu: define('ENVIRONMENT', 'production');
, und der Fehler wird auch auf Ihrem lokalen Host nicht angezeigt.
Update:
Eigentlich funktioniert $this->session->set_userdata('name', $name);
, aber die Funktion userdata () akzeptiert nur ein Argument und erwartet, dass es sich um eine Zeichenfolge handelt
wenn Sie in die Sitzungsbibliothek (/system/libraries/Session/Session.php) schauen, finden Sie sie in der Nähe von Zeile 747:
/**
* Userdata (fetch)
*
* Legacy CI_Session compatibility method
*
* @param string $key Session data key
* @return mixed Session data value or NULL if not found
*/
public function userdata($key = NULL)
{
if (isset($key))
{
return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL;
}
elseif (empty($_SESSION))
{
return array();
}
$userdata = array();
$_exclude = array_merge(
array('__ci_vars'),
$this->get_flash_keys(),
$this->get_temp_keys()
);
foreach (array_keys($_SESSION) as $key)
{
if ( ! in_array($key, $_exclude, TRUE))
{
$userdata[$key] = $_SESSION[$key];
}
}
return $userdata;
}
$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;
.zugang
DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [
L, QSA]
Folge diesen
In der config.php
Set $config['sess_save_path'] = NULL;
Wie Sie gesagt haben, sollte$this->session->set_userdata('user',$result); //$result works fine, it produces
oben $result
so sein
$result = array(
'user' => 'Ab',
.....
'logged_in' => TRUE
);
echo $this->session->userdata('user');
oder
$user = $this->session->userdata('user');
echo $user;
Ich denke, das Problem beim Zugriff auf Sitzungsdaten mit falscher Syntax. Sie können die folgende Syntax verwenden, um Sitzungsdaten festzulegen und Sitzungsdaten abzurufen.
Beispiel für das Setzen von Sitzungsdaten
$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
Beispiel zum Abrufen gespeicherter Sitzungsdaten
$this->session->userdata('user')['name'];
Ich mache viel Forschungs- und Entwicklungsarbeit, aber das Problem ist nicht gelöst, aber plötzlich habe ich meine MySQL-Version überprüft und wenn ich meine SQL-Version ändere, funktioniert es. Wenn Sie ein solches Problem haben, können Sie Ihre Version überprüfen, um ein Ergebnis zu erhalten.
Es scheint, dass das Problem bei PHP Version 7.1 lag, da CI 3.1.6 diese PHP Version nicht unterstützte.
Ich bin nicht sicher, ob dies die richtige Erklärung ist, aber als ich zurück zu PHP Version 5.6) wechselte, fing alles an, absolut gut zu funktionieren.