Ich habe eine PHP-Datei, die manchmal von einer Seite aufgerufen wird, die eine Sitzung gestartet hat, und manchmal von einer Seite, auf der keine Sitzung gestartet wurde. Daher session_start()
erhalte ich bei diesem Skript manchmal die Fehlermeldung "Sitzung bereits gestartet". Dafür habe ich folgende Zeilen gesetzt:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
aber diesmal habe ich diese Warnmeldung bekommen:
Hinweis: Undefinierte Variable: _SESSION
Gibt es eine bessere Möglichkeit, um zu überprüfen, ob die Sitzung bereits gestartet wurde?
Wenn ich benutze @session_start
, funktioniert es dann richtig und macht einfach die Warnungen aus?
php
session
session-variables
Logan
quelle
quelle
Antworten:
Empfohlener Weg für Versionen von PHP> = 5.4.0, PHP 7
Referenz: http://www.php.net/manual/en/function.session-status.php
Für Versionen von PHP <5.4.0
quelle
session_start();session_write_close();
: dann schlägt die if-Bedingung fehl, aber wir haben keine offene Sitzung ...session_start()
die oben in einem Skript gestartet wurde, wird geschlossen, wenn das Skript beendet wird, oder wenn siesession_write_closed()
aufgerufen wird, bevor das Skript beendet wird. Das heißt, eine Sitzung wird geschlossen, wenn ihre Daten in das Sitzungscookie geschrieben werden und die Sitzung für den Zugriff durch ein anderes Skript entsperrt wird, das auch 'session_start' aufruft. SCHLIESSEN bedeutet daher NICHT, dass die Sitzung ZERSTÖRT ist. Sie können eine Sitzung schließen, indem Sie das aktuelle Skript beenden oder aufrufensession_write_close()
, und Sie können sie erneut öffnen, indem Sie aufrufensession_start()
. Zumindest mein Verständnis.Für Versionen von PHP vor PHP 5.4.0:
IMHO sollten Sie jedoch wirklich darüber nachdenken, Ihren Sitzungsverwaltungscode zu überarbeiten, wenn Sie nicht wissen, ob eine Sitzung gestartet wird oder nicht ...
Trotzdem ist meine Meinung subjektiv und es gibt Situationen (Beispiele dafür sind in den Kommentaren unten beschrieben), in denen es möglicherweise nicht möglich ist zu wissen, ob die Sitzung gestartet wird.
quelle
PHP 5.4 führte session_status () ein , was zuverlässiger ist, als sich darauf zu verlassen
session_id()
.Betrachten Sie das folgende Snippet:
Um zu überprüfen, ob eine Sitzung gestartet wurde, wird in PHP 5.4 jetzt empfohlen:
quelle
Sie können dies tun, und es ist wirklich einfach.
Ich hoffe es hilft :)
quelle
$_SESSION=array();
, also scheint diese Antwort in Ordnung zu sein.session_destroy()
aufgerufen wurde,$_SESSION
konnte dann noch gesetzt werden. In Unit-Tests können Sie auch$_SESSION
direkt einstellen . Aber ich habe dies positiv bewertet, da diese Antwort für die meisten praktischen Situationen gut genug sein sollte (bis PHP 5.3 nie mehr zu sehen ist ...)quelle
Vor PHP 5.4 gibt es keine zuverlässige Möglichkeit, dies zu wissen, außer ein globales Flag zu setzen.
Erwägen:
Oder:
Vor PHP 5.4 sollten Sie also einen globalen Booleschen Wert festlegen.
quelle
Für alle PHP-Versionen
quelle
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Überprüfen Sie dies :
Quelle http://php.net
quelle
Verwenden Sie session_id () , es wird eine leere Zeichenfolge zurückgegeben, wenn sie nicht festgelegt ist. Es ist zuverlässiger als die Überprüfung der
$_COOKIE
.quelle
ich hoffe es hilft !
quelle
Dies sollte für alle PHP-Versionen funktionieren. Es bestimmt die PHP-Version und prüft dann, ob die Sitzung basierend auf der PHP-Version gestartet wird. Wenn die Sitzung dann nicht gestartet wird, wird sie gestartet.
quelle
Das einzige, was Sie tun müssen, ist:
quelle
Sie sind sich nicht sicher über die Effizienz einer solchen Lösung, aber dies stammt aus einem Arbeitsprojekt. Dies wird auch verwendet, wenn Sie die Standardsprache definieren müssen
quelle
@
vor einem Funktionsaufruf werden alle Fehler unterdrückt, die während des Funktionsaufrufs gemeldet werden.@
Vorher ein hinzufügensession_start
wird PHP angewiesen, das Drucken von Fehlermeldungen zu vermeiden.Zum Beispiel:
Die Verwendung,
session_start()
nachdem Sie bereits etwas im Browser gedruckt haben, führt zu einem Fehler, sodass PHP Folgendes anzeigt: "Header können nicht gesendet werden: gestartet um (Zeile 12)",@session_start()
In diesem Fall schlägt dies immer noch fehl, aber die Fehlermeldung wird nicht gedruckt Bildschirm.Bevor Sie die Dateien einfügen oder auf eine neue Seite umleiten, verwenden Sie die
exit()
Funktion, Andernfalls wird ein Fehler ausgegeben.Dieser Code kann in allen Fällen verwendet werden:
quelle
Unter PHP 5.3 funktioniert das bei mir:
dann hast du. Wenn Sie die nicht at if-Anweisung nicht setzen, beginnt die Sitzung auf irgendeine Weise. Ich weiß nicht warum.
quelle
Antwort basierend auf @ Meliza Ramos-Antwort (siehe erste Antwort) und http://php.net/manual/en/function.phpversion.php ,
AKTIONEN:
benutze nur openSession ()
quelle
Eigentlich ist es jetzt zu spät, es hier sowieso zu erklären, da es gelöst wurde. Dies war eine .inc-Datei eines meiner Projekte, in der Sie ein Menü für ein Restaurant konfigurieren, indem Sie ein Gericht auswählen und die Reihenfolge entfernen / hinzufügen oder ändern. Der Server, auf dem ich arbeitete, hatte nicht die aktuelle Version, daher habe ich ihn flexibler gestaltet. Es liegt an den Autoren, es zu nutzen und auszuprobieren.
quelle
Funktioniert dieses Code-Snippet für Sie?
quelle
Sie sollten Ihren Code so neu organisieren, dass Sie
session_start()
genau einmal pro Seitenausführung aufrufen.quelle
quelle
PHP_VERSION_ID ist ab PHP 5.2.7 verfügbar. Überprüfen Sie dies also zuerst und erstellen Sie es gegebenenfalls.
session_status
ist ab PHP 5.4 verfügbar, daher müssen wir dies auch überprüfen:quelle
Basierend auf meiner Praxis müssen Sie vor dem Zugriff auf die
$_SESSION[]
anrufensession_start
auf das Skript jedes Mal , um das Skript zu verwenden. Siehe den Link unten für ein Handbuch.http://php.net/manual/en/function.session-start.php
Zumindest für mich
session_start
ist der Name verwirrend. Asession_load
kann klarer sein.quelle
Am Ende hatte ich eine doppelte Überprüfung des Status. PHP 5.4+
quelle
Mit der folgenden Lösung können Sie überprüfen, ob eine PHP-Sitzung bereits gestartet wurde:
quelle
Dies ist, was ich benutze, um festzustellen, ob eine Sitzung gestartet wurde. Verwenden Sie leer und isset wie folgt:
quelle
Ersetzen
session_start();
durch:quelle