it-swarm.com.de

Sitzungen funktionieren nicht in localhost, sondern auf Live-Servern (Codeigniter).

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).

 Database Screenshot

Kann jemand auf den Fehler verweisen? Jede Hilfe wird geschätzt.

12
Shanil Soni

Deine Frage hat ein paar Teile, ich werde sie nacheinander beantworten. 

Informationen zum Abrufen von Werten aus der Sitzung

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'];

Zu den 4 Sitzungsdatensätzen in der Datenbank

Ü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.

In Bezug auf Ihren 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.

Laut den Dokumenten :

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/';
5
Don't Panic

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;
}
1
Vickel
$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;

.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]

0
Sagar Tank

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 producesoben $result so sein 

$result = array(
    'user'  => 'Ab',
    .....
    'logged_in' => TRUE
);

Zugriff auf den Sitzungsschlüssel

echo $this->session->userdata('user');

oder

$user = $this->session->userdata('user');
echo $user;
0
Abdulla Nilam

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'];
0
Kiran Suthar

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.

0
Ram

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.

0
Shanil Soni