PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Session Warnung (http://www.selfphp.de/forum/showthread.php?t=11011)

Don Stefano 20.07.2005 18:07:11

Session Warnung
 
Hallo zusammen!

Als ich gerade dachte, meine Skripte laufen endlich auf meinem gemieteten Webspeicherplatz sehe ich mich mit einem neuen Problem konfrontiert.

Ich verwende Sessions um Daten zu transportieren und angemeldete User zu überprüfen.

Nun gibt mir ein Skript (und ich weiß nicht mal genau welches) die folgende Warung aus:

Zitat:

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown online 0
Ich habe schon recherchiert, dass dies wohl an der Einstellung register_globals = off bei meinem Webserver liegt. Auf diese Einstellung habe ich keinerlei Einfluss.

Ich weiß nicht einmal ob diese Warnung durch den wiederholten Befehl
Zitat:

session_start();
zustande kommt oder dadurch, dass Parameter in Form von
PHP-Code:

 $ergebnis $_SESSION["ergebnis"]; 

übergeben werden.

Was kann ich denn nur tun, damit dieser Fehler verschwindet? Er taucht übrigens auch nur bei manchen Skripten auf und nicht bei allen. Außerdem scheint es eigentlich zu funktionieren. Ich bin mal wieder ratlos.

Es kann ja wohl nicht sein, dass ich mit PHP5 und Mysql 4.1 keine Sessions auf dem Server verwenden kann, nur weil register_globals auf off steht, oder ?

Zumal es ja mit einigen Seiten auch klappt, und eben mit einigen diese Meldung ausgegeben wird.

Ich habe mir natürlich auch schon unter php.net zu Seesions einiges durchgelesen und zwar zu Session Funktionen und session_register.
Dort steht zum Beispiel:

Zitat:

Anmerkung: Bitte beachten Sie beim Arbeiten mit Sessions, dass der Datensatz einer Session nicht angelegt wird, bevor eine Variable mit der Funktion session_register() registriert oder dem superglobalen Array $_SESSION ein neuer Schlüssel hinzugefügt wird. Das gilt auch dann, wenn eine Session mit der Funktion session_start() gestartet wurde.
oder unter session_register:

Zitat:

Wenn Sie wollen, dass ihr Script unabhängig von der Einstellung von register_globals funktioniert, müssen Sie stattdessen das Array $_SESSION verwenden, weil $_SESSION-Einträge automatisch registriert werden. Wenn Sie in Ihrem Script session_register() verwenden, funktioniert es nicht in Umgebungen, in denen die PHP-Anweisung register_globals deaktiviert ist.
Ich verwende aber doch $_Session in Form von z.B.

PHP-Code:

 $ergebnis $_SESSION["ergebnis"]; 

Und ich verwende nirgendwo session_register (). Ich verstehe leider nach wie vor nicht wie ich dieses Problem lösen kann. Ich bin auch leider kein Profi.

Wer ist so nett und kann mir helfen?

xabbuh 20.07.2005 19:43:28

AW: Session Warnung
 
Bist du sicher, dass du wirklich an keiner Stelle in deinen Scripten session_reigster() verwendest?

Don Stefano 20.07.2005 20:44:27

AW: Session Warnung
 
Absolut sicher. Lediglich Session_start().

Ich habe aber gerade mit dem Support telefoniert und die konnten nun nur für mich die Einstellung register_globals = off auf on setzen.

Wenn ich das richtig verstanden habe mit einem Tool oder einer Datei namens htaccess das die Einstellungen nur für mich ändert.

Was genau ist dieses htaccess denn ?

Jedenfalls sind seit dem die Fehlermeldungen wieder verschwunden (zumindest diese ;-)

Mit den restlichen werde ich aber hoffentlich alleine fertig.

Danke und viele Grüße
Stefan

meikel (†) 21.07.2005 06:25:09

AW: Session Warnung
 
Zitat:

Zitat von Don Stefano
Ich habe aber gerade mit dem Support telefoniert und die konnten nun nur für mich die Einstellung register_globals = off auf on setzen.

Das war der falsche Weg.

Die Warnung basiert darauf:
Zitat:

session.bug_compat_42 boolean
Die PHP-Versionen bis 4.2.0 haben eine undokumentierte Funktion/einen undokumentierten Fehler, der es Ihnen gestattet, eine Session-Variable im globalen Bereich zu initialisieren, obwohl register_globals deaktiviert ist. Ab Version 4.3.0 gibt PHP bei Verwendung dieser Funktion eine Warnung aus, wenn zusätzlich session.bug_compat_warn aktiviert ist.
Auslöser ist die Zeile:
PHP-Code:

$ergebnis $_SESSION["ergebnis"]; 

weil dadurch eine Sessionvariable im globalen Bereich initialisiert wird:
Session index == varname

So würde die Fehlermeldung unterbleiben:
PHP-Code:

$ergebnis $_SESSION["s_ergebnis"]; 

Session index <> varname

Eigentlich isses sinnfrei: warum verdoppelst Du die Quelle? $_SESSION verhält sich genauso wie jedes 'normale' Array. Die beiden Unterschiede:
1. ist es superglobal (also automatisch innerhalb von Funktionen und Methoden gültig)
2. wird es bei Scriptende in serialisierter Form im Sessionfile gespeichert.

Und nachdem Du register_globals = On gesetzt hast, ist sie ebenfalls überflüssig, weil PHP nach session_start() alle Indexe der Arrays $_GET, $_POST, $_COOKIE, $_FILES und $_SESSION in den globalen Bereich exportiert werden.

Zitat:

Jedenfalls sind seit dem die Fehlermeldungen wieder verschwunden (zumindest diese ;-)
Warnungen sind keine Fehlermeldungen. Es sind Hinweise auf eine fehlerhafte Konfiguration

Die Lösung wäre:
.htaccess
Code:

php_flag session.bug_compat_42 Off
php_flag session.bug_compat_warn Off
php_flag register_globals Off

Ich rate Dir dringend, register_globals auf Off zu stellen und die beiden anderen Flags ebenfalls, da Du ja sicher kein PHP < 4.3.x verwendest.

Was nämlich sonst passieren kann, kannst Du Dir an diesem Onlinebeispiel angucken (Quellteste werden angezeigt):
http://test.php-help.info/session-7/

Nach dem Klick auf 'Klick' wird auf der Folgeseite die Variable $abc auf 'Seite 3' gesetzt, aber nach session_start() durch den in der Session befindlichen Wert von der Startseite überschrieben.

Hier das selbe Script mit register_globals = Off:
http://test.php-help.info/session-7.1/

HIer abschließend noch ein Beispielscript für den Umgang mit Session:
http://test.php-help.info/session-1/

Don Stefano 21.07.2005 22:40:50

AW: Session Warnung
 
Zuerst einnmal Dankeschön an meikel für die Aufklärung. Leider habe ich aber mal wieder nur die Hälfte verstanden und versuche mal zu resumieren:

PHP-Code:

 $variable $_SESSION["varibale"]; 

initialisiert die Variable im globalen Bereich.
PHP-Code:

 $variable $_SESSION["s_variable"]; 

hingegen im superglobalen Bereich (?) Wo ist der Unterschied zwischen global und superglobal?

Wenn alles so bleiben würde auf meinem Server wie zuvor (globals = off) würde diese Änderung des Codes das Problem mit den Warnungen bereits beheben ? Das wäre alles ?

Oder müßte dafür auch php_flag session.bug_compat_42 Off php_flag session.bug_compat_warn Off mittels htaccess geändert werden.

Wenn ich das richtig verstehe würde dann die Fehlermeldung ausbleiben. Sie würde aber doch auch ausbleiben, wenn ich den Code der Session-Variablen-Initialisierung ändern würde. Habe ich das richtig verstanden?

Oder müßte beides zusammen geändert werden? Wenn ja warum ?


Zitat:

Ich rate Dir dringend, register_globals auf Off zu stellen und die beiden anderen Flags ebenfalls, da Du ja sicher kein PHP < 4.3.x verwendest.
Das stimmt soweit, ich verwende php5 und mysql 4.1.


Zitat:

Was nämlich sonst passieren kann, kannst Du Dir an diesem Onlinebeispiel angucken (Quellteste werden angezeigt):
Das habe ich leider nicht richtig verstanden. Heißt das, ich kann den Wert einer Session Variablen dann nicht mehr verändern, wenn er erst einmal in der Session definiert wurde, oder was sollen mir diese Beispiele sagen?
Ich verstehe es ansonsten wohl leider wirklich nicht.

Bei mir landen in den Session Variablen z.B. die Werte "Login" oder eine "ID", die auf einer nächsten Seite einen bestimmten Codeteil auslöst.

Diese Werte werden auch teilweise innerhalb einer Session überschrieben, z.B. wenn der Code abgearbeitet ist, und der User einen anderen Link betätigt, ist der Wert der Variable "ID" dann anders und wird wieder als $ID = $_SESSION["ID"] initialisiert. Bislang funktionierte das immer einwandfrei und ich hatte keine Probleme.

Ich weiß also einfahc nciht warum ich nun die globals wieder of schalten sollte und meinen Code ändern, wo doch auch so alles funktioniert. Oder ich verstehe das Problem einfach nicht.

Trotzdem vielen Dank für den Beitrag! Vielleicht kannst Du es mir "für Dumme" noch einmal erläutern?

Viele Grüße
Don

meikel (†) 24.07.2005 07:00:20

AW: Session Warnung
 
Zitat:

Zitat von Don Stefano
PHP-Code:

 $variable $_SESSION["varibale"]; 

initialisiert die Variable im globalen Bereich.
PHP-Code:

 $variable $_SESSION["s_variable"]; 

hingegen im superglobalen Bereich (?) Wo ist der Unterschied zwischen global und superglobal?

Die Variable $_SESSION ist superglobal. Das bedeutet, daß Du ua. diese Variable in Funktionen und Methoden nicht via global bekannt machen mußt.

Der globale Namensraum ist (wie soll mans beschreiben) das Hauptprogramm. Also der Teil, in dem PHP zu arbeiten anfängt.

Sieh es mal so:
PHP ist eine Sprache, die wächst. Zwischen der Version 4.1 und 4.2 trat ein Bug im Zusammenhang mit Sessions auf. Scripten, die auf dem Bug basierten, wurde ab v4.3 mit den beiden Config Flags begegnet, die man aber ausknipsen kann, wenn man ordentlich programmieren will.

Sieh Dir mal da meine Config an:
http://test.php-help.info/phpinfo.php

Hier sind Teile der 1. Tabelle und Teile der Sessions Tabelle interessant.

Zitat:

Wenn alles so bleiben würde auf meinem Server wie zuvor (globals = off) würde diese Änderung des Codes das Problem mit den Warnungen bereits beheben ? Das wäre alles ?
Wenn Du weißt, was register_globals = Off bewirkt, solltest Du die beiden "Bug Flags" ausknipsen.

Du solltest auch daran denken, daß sowas Quark ist:
PHP-Code:

$a $_SESSION['a'];
$a $a $irgend_was

weil das einfacher ist:
PHP-Code:

$_SESSION['a'] += $irgend_was

Zitat:

Oder müßte dafür auch php_flag session.bug_compat_42 Off php_flag session.bug_compat_warn Off mittels htaccess geändert werden.
Jou. (s.o.)

register_globals = Off
die beiden Flags ebenfalls.

Dann ist "sauberes Programmieren" keine Kunst mehr.

Zitat:

Wenn ich das richtig verstehe würde dann die Fehlermeldung ausbleiben.
Das sind keine Fehlermeldungen sondern Warnungen, die genau dann auftreten, wenn Du folgendes tipperst:

PHP-Code:

$index $_SESSION['index']; 

register_globals = On erledigt das selbe nach session_start(). Und genau das ist eine Quelle bösartigster Fehler, nach denen man sich 'nen Wolf sucht, weil dann ggf. Formularvariablen nach session_start gnadenlos mit altem Zeuch aus der Session überschrieben werden, wenn die Formularvariable einen gleichnamigen Index in $_SESSION besitzt.

Zitat:

Sie würde aber doch auch ausbleiben, wenn ich den Code der Session-Variablen-Initialisierung ändern würde. Habe ich das richtig verstanden?
Versuche den Mechanismus zu verstehen:
register_globals = Off
konsequente Trennung im globalen Namensraum. Alle Formularvariablen landen in GET, COOKIE oder POST bzw. REQUEST. Die Sessionvariablen bleiben in SESSION.

=> bequemes Arbeiten

register_globals = On
keine Trennung mehr, weil $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SESSION und Teile von $_SERVER und $_ENV in den globalen Namensraum gemüllt werden.

PHP achtet bei den beiden Flags darauf, wenn ein SESSION Index in eine gleichnamige Variable in Global dupliziert wird und warnt dann. Warum davor gewarnt wird, wenn man es richtig macht (register_globals = Off), wissen die Götter oder derjenige, der den PHP Göttern den Stoff verkauft hat. <ggg>

Zitat:

Bei mir landen in den Session Variablen z.B. die Werte "Login" oder eine "ID", die auf einer nächsten Seite einen bestimmten Codeteil auslöst.
Hier meine Auth-Klasse mal zur Ansicht.
PHP4 http://test.php-help.info/auth-4/
PHP5 http://test.php-help.info/auth-3/

Gucks Dir an und versuch das Prinzip zu verstehen. Das Teil ist sehr pflegeleicht, obwohl bestimmt ein paar Schönheitsfehler noch vorhanden sind.

Zitat:

Trotzdem vielen Dank für den Beitrag! Vielleicht kannst Du es mir "für Dumme" noch einmal erläutern?
Einspruch: wenn ich der Meinung wäre, Du wärst dumm, würde ich mir ganz gewiß nicht die Arbeit machen, tonnenweise Hinweise zu tippern. <ggg>

Don Stefano 03.08.2005 00:38:42

AW: Session Warnung
 
Hallo Meikel,

entschuldige bitte, dass ich mich erst jetzt für den neuerlichen Beitrag bedanke aber ich war einige Tage unterwegs.

Ich werde mich der Sache, sobald ich Zeit dazu habe annehmen und die Skripte entsprechend korrigieren.

Vielen Dank!


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:18:29 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.