Inhalt von $_SESSION verändert sich

Miraculixx

Erfahrenes Mitglied
Hallo, ich hänge gerade an einem echt kuriosen Problem fest!

In einem PHP-Skript speichere ich Daten in meine Session-Variable. Am Ende des Skriptes ist folgender Inhalt in der Session:
Code:
array(2) {
  ["login"]=>
  bool(true)
  ["user"]=>
  array(5) {
    ["id"]=>
    string(1) "1"
    ["username"]=>
    string(5) "admin"
  }
}

Wenn ich dann auf der nächsten Seite die Session starte und gleich zu Beginn die Session auslese, dann steht allerdings das drin:
Code:
array(2) {
  ["login"]=>
  &bool(true)
  ["user"]=>
  &array(5) {
    ["id"]=>
    string(1) "1"
    ["username"]=>
    string(5) "admin"
  }
}

Wie kann ich mir das erklären? Und was kann ich dagegen unternehmen?
Ich kann so nämlich auf die Variablen nicht mehr zugreifen :(
Und wenn ich wieder auf die nächste Seite klicke, ist das in der Session gespeichert:
Code:
array(2) {
  ["login"]=>
  &bool(true)
  ["user"]=>
  &object(userc)#1 (0) {
  }
}
Und ich bekomme folgende Fehlermeldung:
Code:
Fatal error: Cannot use object of type userc as array in /var/www/top.php on line 23
Code:
top.php line 23:
if($_SESSION['user']['username'] == "admin")


Bin für Tipps sehr dankbar!
 
Du schreibst die Daten nicht direkt in das Session-Array sondern referenzierst lediglich die entsprechenden Variablen, die den Wert enthalten. Bei der nächsten Verwendung existieren die referenzierten Variablen wahrscheinlich nicht mehr (in der ursprünglichen Form), was dann zu entsprechend unerwarteten Fehlern führt.
Im Code sollte es bei dir etwa so aussehen, oder bin ich gerade auf dem Holzweg?
PHP:
$_SESSION['login'] = &$loginFlag;
Sollte ich mich nicht irren, sollte es bei primitiven Datentypen wie int, bool, string, ... reichen die Referenzierung wegzulassen.

Bevor du die Session startest oder fortsetzt solltest du alle benötigten Klassen und Objekte bereitstellen können - Also erst nach dem Laden der Klassen und Instanzieren der Objekte, die du in der Session referenzierst sollte das $_SESSION-Array inkubiert werden.
 
Zuletzt bearbeitet:
Hey vielen Dank für die schnelle Antwort!

An das habe ich natürlich auch zuerst gedacht, aber dem ist nicht so. Meine Zuweisungen sehen so aus:
Code:
$_SESSION['login'] = true;
$_SESSION['user']['id'] = $myUser['id'];

Außerdem sind die Werte ja zu Beginn noch richtig gespeichert, erst wenn die Seite neu geladen wird steht das falsche drin.

Ahja, und noch etwas:
Ich habe dieses Problem nur, wenn ich die Dateien auf meinem Webserver ausführe. Lokal (unter XAMPP) tritt dieser Fehler nicht auf!
Vielleicht ein Hinweis?

EDIT:
Also meine Vermutung ist, dass am Server irgendwas falsch compiliert wurde!?
Habe folgendes Testskript erstellt:

PHP:
<?php
session_start();
if(empty($_SESSION['hugo']))
	$_SESSION['hugo'] = "boss";
echo "<textarea name='hugo1' cols='150' rows='40'>";
var_dump($_SESSION);
echo "</textarea>";
echo "<a href='index.php'>BLUBB</a>";
?>

Hier zu erreichen: http://n-design.biz/test/index.php

Ich habe keine Ahnung warum das so ist...
 
Zuletzt bearbeitet:
Ist in der Webserver-PHP-Konfiguration eventuell das automatische Starten der Session aktiviert?

Das scheint kein gängiges Problem zu sein. Welche PHP-Version auf was für einem System (Linux, Windows, ...) nutzt du? Eventuell findet sich ein entsprechender Bug-Report. Hast du die Möglichkeit PHP auf dem Server zu up- oder downgraden? Sofern du einen VPS oder einen Server bedienst, könntest du eine zweite PHP-Installation vornehmen und über diese sicher testen.

Kann das Sympthom weder auf den Maschinen im LAN erzeugen (PHP 5.3 und 6pre) noch auf einem entfernten Server (PHP 5.2.3).
 
Automatisches Starten ist deaktiviert, wenn ich das richtig interpretiert habe.

Hier die PHP-Info:
http://n-design.biz/test/info.php

Vielleicht ist das ja auch noch relevant:
Damit der Server meine Dateien mit PHP5 interpretiert, muss ich eine .htaccess-Datei immer mit ins Verzeichnis legen mit folgendem Inhalt:
Code:
RemoveType .php
AddHandler x-httpd-php5 .php

Da das ein gemieteter Webspace ist, kann ich nix installieren/deinstallieren/etc.
Ich kann nur den Betreiber bitten, irgendwelche Funktionen zu (de-)aktivieren.
Ich hoffe aber trotzdem, dass sich das Problem beheben lässt.
 
Hi,

schalte mal register_globals aus, indem Du in Deine .htaccess folgende Zeile einfügst:

Code:
php_flag register_globals off

Und nimm aus Sicherheitsgründen die info.php wieder vom Netz.

LG
 
Geht leider nicht, bekomme folgende Fehlermeldung:
Code:
The server encountered an internal error or misconfiguration and was unable to complete your request.

Außerdem habe ich die auf meinem lokalen Server auch aktiv, und da funktioniert es ja...

Ich hoffe es gibt noch eine andere Möglichkeit?
 
Hi,

wenn ich auf meinem Rechner register_globals anschalte und Dein Testscript ausprobiere, bekomme ich genau den gleichen Fehler...
Mehr fällt mir da auch nicht ein.

LG
 
Stimmt, sorry, du hattest recht!
Ich habe mich leider verschaut - bei mir lokal ist es auf OFF, und ich habe es auf meinem Server nun deaktivieren lassen, und es geht!

WOW, ich bin begeistert! :-) Vielen vielen Dank, du hast mir sehr geholfen.;-)
 
Zurück