Ich mache ein Anmeldesystem, aber wenn sich ein Benutzer anmeldet, speichert er tatsächlich keine der Daten, die er in der Sitzung haben möchte. Ich habe sogar die Datei der Sitzung überprüft und sie war leer. Ich habe session_start (); auf allen Seiten. Was könnte ich sonst falsch machen? Hier ist der Code für die beiden Hauptseiten.
der Login-Code:
%Vor%Der Header, der auf jeder Seite enthalten ist:
%Vor%Ein kleiner Hintergrund:
Hier sind ein paar Vorschläge (ich weiß nicht wirklich was passiert und / oder warum; also sind sie nur Vorschläge; vielleicht wird man das Problem lösen ^^) .
Zunächst ein paar Fragen:
(Sie spielen eine Rolle, wenn keiner dieser Vorschläge den Trick macht)
var_dump($_SESSION); die;
verwenden, was gibt es?
Erste Idee: Was ist, wenn Sie eine Kopfzeile setzen, um das Zwischenspeichern durch den Browser zu deaktivieren?
Sachen wie diese, zum Beispiel:
Zweite Idee (zumindest unter Windows): Haben Sie versucht, Ihre Antivirus- / Firewall-Funktion zu deaktivieren?
Ist der Sitzungscookie korrekt im Browser des Clients erstellt?
Wenn Sie Subdomains verwenden (oder nicht): Ist die Domain des Cookies OK? Was ist mit dem Ablaufdatum?
Dritte Idee:
error_reporting
auf E_ALL
gesetzt ist, was nett ist display_errors
? Ist es auf Ein eingestellt, damit Fehler angezeigt werden? error_log
?
Noch eine: Sind Sie sicher, dass absolut nichts zur Ausgabe vor dem session_start
kommt? Nicht einmal weiße Flächen?
Noch eine andere: Sind Sie sicher, Berechtigungen für die Verzeichnisse / Dateien?
Was sind die Berechtigungen für das Verzeichnis der Sitzung und für die (leeren) Dateien, die erstellt werden?
Mir fallen die Ideen aus ... Mit ein bisschen Glück wird vielleicht einer von ihnen der Richtige sein ... Oder dir helfen herauszufinden, was der Richtige ist!
Viel Glück!
Eine wahrscheinliche Ursache ist, dass die Ausführung nach den Kopfzeilenanweisungen ('Ort ...') fortgesetzt wird. Es sieht jedoch so aus, als ob Sie möchten, dass es aufhört. Daher sollten Sie "exit" hinzufügen. nach der Umleitung auf error.php. Zum Beispiel:
%Vor%Dies könnte auch ein Teil Ihres Problems sein, da Sie nie zu error.php gehen und den Fehlercode sehen. Die letzte Zeile wird immer ausgeführt:
%Vor%Und da das Standardverhalten von header () bestehende Header ersetzen soll, gehen Sie immer zu index.php, egal was passiert.
Basierend auf einem Kommentar in der PHP header () Dokumentation, glaube ich Ihnen müssen Sie am Ende Ihrer Datei Folgendes tun. header('Location: x');
ist ein Sonderfall der Verwendung der header()
-Funktion und kann die Sitzungsübergabe beeinträchtigen, wenn eine Sitzung keine Zeit zum Schreiben hatte, bevor der header()
-Aufruf ausgeführt wurde. session_write_close () sollte das beheben.
Die SessionID ist nirgendwo zu finden. Ich hatte dieses Problem einmal, Sitzungen wurden wie verrückt erstellt, aber nichts wurde gespeichert. (Stellen Sie außerdem sicher, dass Sie über ordnungsgemäße Schreibberechtigungen für den Sitzungsordner verfügen, auch wenn einmal ein Problem dieser Art aufgetreten ist)
Was Sie wirklich tun möchten, ist
$ sessid = session_start (); // für den Beginn einer neuen Sitzung und
session_start ($ sessid); // bei der Startanforderung für jeden nachfolgenden Aufruf, bis die Sitzung mit session_destroy ()
zerstört wirdNatürlich liegt es an Ihnen, die Variable $ sessid zwischen den Webseiten zu übergeben. Ich bevorzuge es, ein & amp; sessid = link additiv zu verwenden; & gt; (So weiß ich sofort, wenn etwas schief gegangen ist; P)
Denken Sie daran, dass die einzige Möglichkeit, die ordnungsgemäße Wiederherstellung der Sitzung sicherzustellen, die Weitergabe der Sitzungs-ID ist. Ich weiß, dass es optional ist, und auf den meisten Systemen sollte es einfach out-of-the-box funktionieren, aber manchmal nicht und es gibt KEINE Garantie für das Sitzungsverhalten bei Shared Hosting.
Wenn Sie Ihre Sessions in einer Klasse mit "magischen" Standard-Handlern für __set () und __get () verpacken möchten, könnten Sie das später noch einfacher machen, um Sitzungsdaten zu verifizieren (der __call () - Handler) besonders nützlich für das). Und lassen Sie den Konstruktor für die Klasse eine Session-ID erwarten, wobei 0 (oder -1 oder was auch immer) 'neue Sitzung starten' ist und stellen Sie sicher, dass es Fehler schreit, wenn die ID nicht explizit gesetzt wird - das wird Sie auf% aufmerksam machen co_de% Probleme.
--------- [Bearbeiten
Und, oh, habe ich erwähnt - in einer geteilten Umgebung mit vielen und vielen Benutzeranfragen kann das explizite Benennen Ihrer Sitzungen nicht zu einem Durchblutungsproblem führen (ein Benutzer wird als ein anderer angemeldet). In den meisten Fällen passiert dies nicht, aber wenn Sie eine wirklich vermasselte Hosting-Konfiguration haben, können Sie Ihre Sitzungen nicht benennen und sich auf "Standardverhalten" verlassen, was zu mehreren Katastrophen gleichzeitig führen kann. ; -)
Ich muss dem zustimmen, was Jason vorher gesagt hat. Fügen Sie einfach die session_start();
-Zeile vor allem im Login-Skript hinzu. Setzen Sie es direkt nach der Funktion session_start () irgendwo, nicht einmal in der Kopfzeile.
Also modifiziere deinen Code wie folgt
%Vor%gefolgt von Rest Ihres Codes ...
Hoffe, das löst das Problem.
Ich habe den Code getestet und sogar die ini-Einstellungen repliziert.
Ich habe einige einfache Objekte erstellt, um db und user zu ersetzen. Und wegen was démon sagte, wenn die der checks in Bezug auf Benutzer und db scheitern, es wird immer noch eine leere Indexseite angezeigt (Mein Testindex hat den Inhalt des $ _SESSION superglobal ausgedruckt).
Also, ist es möglich, dass der Fehler in den Klassen db oder user liegt? Hast du das getestet? Um zu sehen, ob das Problem auf diesen Klassen liegt, ist es eine einfache Frage, nach jedem Header-Aufruf exit hinzuzufügen, wie es darmon gesagt hat.
Stellen Sie sicher, dass Ihr session.save_dir korrekt eingestellt ist. Wenn Sie sich auf einer Website wie Media Temple befinden, auf der Sie in home / #### / domains / html gehostet werden, ist sie möglicherweise nicht korrekt eingerichtet und wird nicht gespeichert.
Schau dir deine php.ini-Einstellungen an. Insbesondere möchten Sie session.auto_start
auf 0 setzen, wenn Sie session_start()
manuell ausführen. Und wenn Sie sich auf das Session-Cookie oder das Umschreiben transparenter URLs verlassen, benötigen Sie auch session.use_cookies=1
und / oder session.use_trans_sid=1
.
Zunächst einmal: Auf welcher PHP-Version hosten Sie?
In PHP Versionen & lt; 5.3.0 session_start () gibt immer TRUE zurück, auch wenn das Starten der Sitzung fehlschlägt. (Siehe changelog .)
Zweitens: Hast du es versucht
? %Vor%Drittens: Sie sollten das Problem isolieren. Probieren Sie Folgendes aus
Erstellen Sie eine neue Datei namens session_test.php mit:
%Code% ? & gt;Gehen Sie zu http: //: /session_test.php in einem Browser
Dadurch wird sichergestellt, dass das Problem in der Kombination php / apache | IIS und nicht im gesamten anderen Code liegt.
Es klingt hier nicht nach der Ursache für Ihre Probleme, aber da Sie noch keine Lösung gefunden haben, können Sie auch überprüfen, ob Ihr Host load balancing verwendet, ohne Sitzungsdaten zu synchronisieren. Dies bedeutet, dass Ihr Benutzer für jede Anfrage an einen anderen Server gesendet werden kann. Wenn das Verzeichnis der Sitzungsdaten nicht auf allen diesen Servern freigegeben ist, gehen Ihre Sitzungsdaten verloren.
Wahrscheinlich nicht der Fall hier, aber es hat mir vor einer Weile ernsthafte Kopfschmerzen verursacht, also poste ich es für alle Fälle.
Ich hatte das gleiche Problem. Meine Lösung war ein bisschen anders als der Rest hier. In meiner php.ini
Datei hatte ich diese Einstellung register_globals=On
.
Und in meinem Code lässt sich sagen, dass ich ein $_SESSION['user']
hatte und später in meinem Code etwas zu $user
zugewiesen hatte, das meine $_SESSION['user']
Informationen durch das, was ich $user
zugewiesen hatte, ersetzt hat.
Stellen Sie also sicher, dass register_globals
deaktiviert ist oder ändern Sie Ihre Variablennamen. = D
Der Speicherplatz ist möglicherweise ebenfalls eines der Probleme. Denken Sie daran, Ihren Speicherplatz zu überprüfen, wenn er voll ist, kann er nicht geschrieben werden.