2010-12-08 18 views
0

Ich entwickle ein PHP-Projekt auf LAMP-Server. Jetzt habe ich ein Problem auf Sitzungsvariable und lokaler Variable. In meinen Systemen set.php setze den Wert in Sitzung und dann in second.php, setze ich diese Sitzungsvariable auf meine lokale Variable. Dann ergreifen Sie Maßnahmen und löschen Sie die Sitzungswerte. Aber ich verliere auch den Wert in meiner lokalen Variable. Wie kann ich dieses Problem lösen? Struktur der Codierung Flusses ist wie folgendSitzungswerte können lokale Variablen überschreiben

In first.php

$_SESSION['var'] = "test"; 

In second.php

$var = $_SESSION['var'] ; 
$_SESSION['var'] = ""; 
echo $var;   // at this time ,i cant also see my local variable values 
+0

Haben Sie vor '$ _SESSION ['var'] =" ";'? –

+0

Ja, ich mache es und es gibt Wert in $ _SESSION ['var'] und auch in der lokalen Variable. –

Antwort

0

Sie haben register_globals eingeschaltet. Dies ist in der Tat sehr schlecht, weil es die Eingabe von Variablen in Ihrem Skript durch einen Endbenutzer ermöglicht (z. B. mit Cookies).

Es ist veraltet. Schalten Sie es aus, schnell (in php.ini, oder wenn Sie nicht können, in einem. Htaccess mit einer php_flag Direktive). Wenn Ihr Skript davon abhängt, ändern Sie Ihr Skript.

+0

Ja, jetzt löse ich das so, indem ich register_globals in der .htaccess-Datei meines Projekts ausstelle. Vielen Dank für deine Antwort. –

1

Wenn das alles, was Sie in Ihrem ersten & zweiten Skript ist, können Sie dann sicherlich verpasst session_start() am Anfang von einem oder allen von Ihrem Skript.

Werfen Sie einen guten Blick in Ihre PHP-Fehlerprotokoll, erhalten Sie möglicherweise eine bessere Erklärung darüber, was fehlt und was falsch ist. Ihr Code sollte gut laufen, wenn Sie session_start() am Anfang jedes Skripts hatten, das Sitzung verwendet.

Wenn Sie nicht explizit session_start() aufrufen, ist die Variable $_SESSION nichts anderes als eine benutzerdefinierte Variable. Sie weisen also im ersten Skript einer benutzerdefinierten Variablen einen Wert zu und im zweiten Skript nur einen Aufruf eine nicht vorhandene benutzerdefinierte Variable. Und seien Sie vorsichtig, dass php case sensitive ist, $_SESSION ist nicht dasselbe wie $_Session.

Es gibt keine Möglichkeit, eine Variable remote überschrieben werden können, wenn sie durch Bezugnahme zugewiesen wurden, werfen Sie einen Blick auf dieses Beispiel:

$b = 1; 
$a =& $b; 
echo $a; // will output 1 
$b = 2; 
echo $a; // will output 2 

Here ist eine schöne Erklärung, wie Referenzen funktioniert in PHP.

+0

Ja, ich rufe session_start() auch auf allen Seiten auf. Vor dem Löschen der Sitzungsvariablen enthält die lokale Variable die Werte. Die lokale Variable hat die Werte nach dem Löschen der Sitzungswerte verloren. Sie hängt damit zusammen, dass sie denselben Namen für lokale Variablen und Sitzungsvariablen angibt. Jetzt habe ich einen Punkt in php.ini gefunden, das ist [register_globals On]. Jetzt ändere ich es zu [register_globals Off] und dann gibt es keinen Effekt auf die lokale Variable nach dem Löschen der Sitzungsvariablen. Wie denkst du über meine Änderung nach? –

+0

Nun, Sie haben das Richtige getan, das ist die einzige Erklärung neben dem Fehlen von 'session_start()'. Hier ist eine kurze Erklärung, theoretisch, wenn Sie 'register_globals' eingeschaltet haben, ruft $ _SESSION ['var']' tatsächlich eine Variable namens '$ var' auf, das ist das gleiche wie das Aufrufen von' $ _POST ['var'] 'und' $ _GET ['var'] ', deshalb ist das Zuweisen von leerem Text zu einer Sitzungsvariablen dasselbe wie das Zuweisen der Variablen selbst. Es gibt eine gute Diskussion darüber hier: http://groups.google.com/group/comp .lang.php/browse_thread/thread/bac6f1c426ef4b22/c3b0666dea7d75fd –