2010-06-03 5 views
10

Ich habe das PHP-Handbuch für dieses Problem gelesen und es scheint ein ziemlich häufiges Problem, aber ich habe noch eine Lösung zu finden. Ich speichere Sitzungen in einer Datenbank. Mein Code ist wie folgt:PHP: Sitzung speichert nicht vor Header-Weiterleitung

// session 
$_SESSION['userID'] = $user->id;   
header('Location: /subdirectory/index.php'); 

Dann an der Spitze der index.php nach den session_start(), ich habe den $ _SESSION global var_dumped und die Benutzer-ID ist nicht drin. Wie gesagt ich habe mir das PHP-Handbuch (http://php.net/manual/en/function.session-write-close.php) angeschaut und weder session_write_close noch session_regenerate_id(true) funktionierte für mich. Kennt jemand eine Lösung?

Bearbeiten: Ich habe session_start() am Anfang meiner Datei. Wenn ich var_dump die Sitzung global vor der Header-Umleitung, ich sehe die Benutzer-ID in dort, aber nicht in der anderen Datei, die in einem Unterverzeichnis dieses Skripts ist

+0

Sind Sie 'session_starting()', wo Sie die Umleitung tun? –

+0

und sind Sie sicher, dass $ user-> id gesetzt ist? – ahmet2106

+0

Hallo, bitte sehen Sie den Kommentar ich links für @ Ahmet2106 Post – phpNutt

Antwort

0

Haben Sie eine session_start(); an der Spitze?

Nicht getestet, aber man kann nicht so etwas tun:

session_start(); 
$_SESSION['userID'] = $user->id; 
if($_SESSION['userID'] == $user->id) 
{ 
    header('Location: /index.php'); 
} 

ich vorher noch nie dieses Problem haben, interessante

+0

Ja, das tue ich. Wenn ich var_dump die Sitzung global vor der Header-Weiterleitung, ist es dort, nur nicht, wenn ich zu einer neuen Datei in einem Unterordner des ursprünglichen Skripts gehen – phpNutt

+0

@Matt lustig, aber es ist wirklich interessant, weil dort sollte die Sitzung gesetzt werden, vielleicht löscht irgendein anderer Code Ihre Sitzung, Sie sind sicher nirgendwo sonst ein session_destroy(); ? – ahmet2106

+0

Seltsam, ich habe $ _SESSION ['userID'] in $ _SESSION ['uid'] geändert und es hat wie erwartet funktioniert. Ich weiß nicht, warum die zwei Großbuchstaben einen Unterschied machen. Ich habe es auch mit userId versucht und das war auch in Ordnung. Irgendwelche Ideen, warum es UserID nicht akzeptieren würde? mit zwei Hauptstädten, im verblüfften – phpNutt

0

userID hat keine Keyword-Status.

Nur Grund zu mir, $ _SESSION ['userID'] wird irgendwo überschrieben oder gelöscht.

Stellen Sie sicher, dass Sie session-> start() in allen Dateien verwenden, die Sie hinzufügen/auf die Sitzung zugreifen möchten.

Eine wichtige Sache (die in Ihrem Fall möglicherweise nicht anwendbar ist) ist, wenn die Sitzung mit Cookie behandelt wird, kann Cookie gemacht werden, nur unter bestimmten Verzeichnissen und Unterverzeichnissen unter diesem zugänglich zu sein. In Ihrem Fall wird das Unterverzeichnis trotzdem Zugriff auf die Sitzung haben.

-2

Versuchen Sie, session_name() vor Ihnen session_start() zu geben.

Und Schalter error_reporting(15), um Fehler zu sehen.

4

@ Matt (nicht in der Lage noch einen Kommentar ...): If:
a) Es ist in der Sitzung erscheint vor
b Redirect) anderen Tasten arbeiten

80% der Zeit das Problem register_globals , und die Verwendung einer gleichbezeichneten Variablen $ userID irgendwo (die anderen 19% überschreiben nur an Stellen, die man nicht erwartet, 1% kann keine Sitzung schreiben/sperren, bevor die Umleitung und veraltete Daten in diesem Fall versuchen könnten session_write_close() vor der Weiterleitung). Es versteht sich von selbst, sollte register_globals aus sein: P

+0

3 Jahre später. session_write_close war der beste Kommentar für heute! –

0

Achten Sie darauf, beide Seiten sind die gleichen PHP-Version (php5, php4 manchmal unterschiedliche Sitzungs Pfade)

0

Ich habe nicht von diesem Problem gehört, aber ich haven Ich habe die Sitzungen nicht so oft benutzt.

Mit Sitzungen müssen Sie ein paar Dinge tun und ein paar Einstellung Setup:

  • Cookies aktiviert auf Client-Seite
  • session_start(), bevor etwas passiert
  • stellen Sie sicher, Sie don‘ t die Sitzung zerstören (außer sie möchten sich abmelden)
  • Die PHP Session ID muss identisch sein (betrifft Cookies)

Ein weiteres Problem könnte die $ user-> ID sein, die einen Verweis auf ein Objekt zurückgibt, das auf der nächsten Seite nicht existiert. Höchstwahrscheinlich nicht, aber stellen Sie sicher.

Wenn ich Ihren Code sah, konnte ich Ihnen viel mehr helfen. Aber beim Debuggen überprüfe den Sitzungsschlüssel mit session_id() und stelle sicher, dass es derselbe ist. Wenn Sie das versuchen könnten, dann sagen Sie mir, ich könnte weiter helfen.

Ich würde auch gerne wissen, wie das endet, wenn ich wieder in die Sitzungen komme.

10

Ich weiß, das ist ein altes toppic, aber ich fand die Lösung (für mich). Ich habe nach dem Header einen Exit gesetzt. Diese

$_SESSION['session'] = 'this is a session'; 
header('location: apage.php'); 
exit; 

funktioniert für mich

+0

Danke! Das funktioniert bei mir :) – mattpark22

+0

Das hat auch für mich funktioniert. – jenovachild

+0

Es funktioniert nur für das gleiche Verzeichnis. Wie funktioniert das für Unterverzeichnis? ZB: von http: /domain.com zu http: /domain.com/subdir/? – arrowman

0

ich das gleiche Problem vor kurzem hatte. Ich schreibe eine angepasste MVC-Website für die Schule und wie alle gesagt haben, muss start_session() in den ersten Zeilen des Codes geschrieben werden.

Mein Problem war die Position von "session_start()". Es müssen die ersten Zeilen Ihres globalen Controllers sein, nicht die ersten Zeilen der Ansicht. $ _SESSION war in den Controller-Dateien nicht verfügbar, da es nur initiiert wurde, wenn der Server die Ansicht rendert.

Dann benutze ich session_write_close() nach dem Header ('location: xxx.php') Aufruf zu Sitzungsvariablen für die nächste Anfrage zu halten.

ex:

globalController.php:

//First line 
session_start(); 
require_once('Model/Database.php'); 
require_once('Model/Shop/Client.php'); 
... 

logonController.php:

... 
//Users is validated and redirected. 
$_SESSION['client'] = $client; 
header('location: index.php'); 
session_write_close(); 

Hoffe, dass es Ihre Probleme gelöst.

0

Das war verdammt nervig, aber ich habe endlich eine Lösung gefunden.

config.php ich hatte: include 'session.php';

Am Anfang von session.php hatte ich: session_start();

von session_start() an die Spitze der config.php, Viola bewegen ...

Problem gelöst!

+0

Es ist ziemlich gut, dass Sie das Problem gelöst haben. Ich rate Ihnen einfach, in Ihrer Lösung etwas sauberer zu sein, damit es auch anderen Lesern hilft. – sachinjain024

1

Sie sollten die Sitzung starten, bevor Sie das Sitzungsarray verwenden.

PHP-Code,
session_start();
$ _SESSION ['userID'] = $ user-> id;

header ('Ort: /subdirectory/index.php');