PHP-Sitzungsdaten werden nicht gespeichert

7

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:

  • Windows 7 (auch an Windows
  • ausprobiert)
  • Server 2008, aber derzeit auf 7) PHP
  • 5 lokales Problem ist vorhanden
  • für alle Problem existiert in allen
  • Browser
The.Anti.9 26.07.2009, 20:20
quelle

18 Antworten

11

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)

  • Welche Version von PHP / Apache verwenden Sie?
  • Sind Sie auf Windows? Linux?
  • Wenn Sie auf Ihrem "Produktions" -Server sind, welchen Hosting-Service verwenden Sie? Vielleicht ist da etwas Besonderes?
  • Ist das Problem für jeder vorhanden?
    • Gibt es immer ein Problem, wenn Sie die Site durchsuchen?
    • Ist es immer noch vorhanden, wenn Sie von einem anderen Browser auf die Site zugreifen?
    • Was ist mit einem anderen Computer?
  • Wenn Sie am Ende des Skripts, das Daten in der Sitzung festlegt, etwas wie 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:

%Vor%


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:

  • Sie haben gesagt, dass error_reporting auf E_ALL gesetzt ist, was nett ist
  • Was ist mit display_errors ? Ist es auf Ein eingestellt, damit Fehler angezeigt werden?
  • Gibt es in PHP / Apache error_log ?
  • etwas Interessantes?


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?

  • Die Berechtigung zum Schreiben in ein Verzeichnis bedeutet, dass Sie neue Dateien erstellen und / oder alte löschen können.
    • Aber, wenn ich mich richtig erinnere, nicht dass du sie modifizieren kannst
  • Um Dateien zu ändern, benötigen Sie auch Schreibzugriff auf die Dateien
    • Eigentlich muss Ihr Webserver Schreibzugriff auf diese Dateien haben ^^

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!

    
Pascal MARTIN 29.07.2009, 19:03
quelle
8

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.

    
daremon 01.08.2009 23:57
quelle
4

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.

%Vor%     
zombat 27.07.2009 00:22
quelle
3

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 wird

Natü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. ; -)

    
Egon_Freeman 26.07.2009 22:05
quelle
2

Langschuss aber erwähnenswert:
Ist PHP richtig konfiguriert, um Sitzungen zu behandeln? Was ist die phpinfo () Ausgabe?

    
Pierre 29.07.2009 00:16
quelle
1
  • Ich schlage als erstes vor,

    zu verwenden

    error_reporting (E_ALL);

    am Anfang jeder Datei

  • Zweitens denke ich, dass das Problem darin besteht, dass Sie 2 session_starts einschließen, und was passiert, ist, dass Sie nicht dieselbe session_id verfolgen, die Sie denken.

dassouki 26.07.2009 20:57
quelle
1

Ich habe merkwürdige Probleme gesehen, wenn session_start () nicht die allererste Codezeile auf der Seite ist. Versuchen Sie, Ihre session_start () s über Ihre Includes und Requests zu verschieben und sehen Sie, ob das Problem behoben ist.

    
Jason 26.07.2009 21:44
quelle
1

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.

    
Christy John 31.07.2009 11:37
quelle
1

Überprüfen Sie, ob Zeilenumbrüche enthalten sind. Irgendwann, ein Newline nach dem Schließen? & Gt; wird ausgegeben und verhindert, dass die Sitzung erstellt wird. Das hat mich ernst genommen, bevor ich es herausgefunden habe.

    
dar7yl 31.07.2009 16:58
quelle
1

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.

    
Juan 02.08.2009 01:03
quelle
0

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.

    
Tyler Carter 26.07.2009 20:22
quelle
0

Sieht so aus, als ob der Sitzungs-ID-Cookie nicht gesetzt wird

    
rmontagud 26.07.2009 20:25
quelle
0

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 .

    
staticsan 29.07.2009 00:53
quelle
0

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

  • Was passiert, wenn Sie die Seite aktualisieren? (A.k.a: Funktionieren Ihre Sitzungen jetzt?)

Dadurch wird sichergestellt, dass das Problem in der Kombination php / apache | IIS und nicht im gesamten anderen Code liegt.

    
Huppie 04.08.2009 05:59
quelle
0

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.

    
10goto10 04.08.2009 14:22
quelle
0

Gehen Sie zu dieser Site und laden Sie das fertige Login-System herunter (tolle Tutorial-Seite!), es ist dasselbe wie Ihres!

Ссылка

Es beantwortet vielleicht nicht Ihr Sitzungsproblem, aber löst das Thema fast auf gleiche Weise; D

    
elhombre 04.08.2009 12:32
quelle
0

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

    
Aust 06.02.2013 00:38
quelle
0

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.

    
Julius Vai Ee 09.06.2017 07:40
quelle

Tags und Links