Frank Stabenau: Register Globals

Hallo,

ich habe dieses dumme Problem mit den Register Globals mit folgender Fehlermeldung:

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.

Ich bin dabei ein Shop zu schreiben und habe einen Warenkorb in dem ich pro Artikel ein Array in der Session speichere.

Angenommen ich habe 3 Artikel in meiner Session gespeichert, kann ich 2 von denen löschen und beim 3. bekomme ich dann die Fehlermeldung.

Wenn ich allerdings über einen anderen Button den gesammten Warenkorb lösche mit session_unregister("warenkorb") funktioniert es das auch der letzte Eintrag gelöscht wird.

Nach langem rumprobieren dachte ich mir ok, mache ich einfach eine Abfrage if($menge == 0 && count($warenkorb) == 1) { dann mach mal session_unregister("warenkorb")... } Aber auch das funktioniert an dieser Stelle nicht und die gleiche Meldung kommt.

Ich habe auch versucht die Variablen vorab nicht mehr in der Session zu registrieren um sie später mir $_SESSION["warenkorb"] direkt zu füllen... nix :-/
Auch unset() brachte keinen Erfolg.

Wisst ihr vielleicht Rat?

Gruß
Frank

  1. <offtopic>
    Bevor Du sowas selbst schreibst - hast Du Dir mal www.oscommerce.com angeschaut?
    </offtopic>

    1. <offtopic>
      Bevor Du sowas selbst schreibst - hast Du Dir mal www.oscommerce.com angeschaut?
      </offtopic>

      Jo, ich kenne den Shop von Oscommerce. Nur soll es ein ziemlich individuell angepasster Shop werden. Wenn ich anfange den anzupassen, bin ich schneller den selber zu schreiben. Meiner soll ja auch nicht so umfangreich sein.

      Aber danke für den Tip.

      Gruß Frank

  2. Moin!

    ich habe dieses dumme Problem mit den Register Globals mit folgender Fehlermeldung:

    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.

    Wenn ich allerdings über einen anderen Button den gesammten Warenkorb lösche mit session_unregister("warenkorb") funktioniert es das auch der letzte Eintrag gelöscht wird.

    Gaanz wichtige Sache:

    1. register_globals gehört "off". Sorge dafür, dass dein Entwicklungssystem das so hat, und sorge ebenfalls dafür, dass das auf dem Liveserver so sein wird.
    2. session_unregister() sollst du nicht benutzen. Ebenso session_register(). Beides ist dir verboten. Du kriegst durch Aufruf von session_start() das Array $_SESSION wiederhergestellt, und darin kannst du alle Werte abspeichern, die nach Skriptende gesichert werden sollen. Weitere Session-Funktionen (session_*()) benötigst du in 99% aller Fälle nicht.

    Ich habe auch versucht die Variablen vorab nicht mehr in der Session zu registrieren um sie später mir $_SESSION["warenkorb"] direkt zu füllen... nix :-/

    Wie gesagt: $_SESSION ist der richtige Ansatz - und außerdem wäre es sicher hilfreich, wenn du deine Cookies mal löschst, damit du eine neue, saubere Session kriegst. Alte Session-Daten können die Fehlermeldung auch provozieren, obwohl der Grund schon gelöscht wurde.
     - Sven Rautenberg

    1. Danke für die Antwort,

      1. register_globals gehört "off". Sorge dafür, dass dein Entwicklungssystem das so hat, und sorge ebenfalls dafür, dass das auf dem Liveserver so sein wird.

      Ich arbeite bereits mit register_globals off, online isses allerdings on...

      1. session_unregister() sollst du nicht benutzen. Ebenso session_register(). Beides ist dir verboten. Du kriegst durch Aufruf von session_start() das Array $_SESSION wiederhergestellt, und darin kannst du alle Werte abspeichern, die nach Skriptende gesichert werden sollen. Weitere Session-Funktionen (session_*()) benötigst du in 99% aller Fälle nicht.

      Ok danke, da habe ich einen Anhaltspunkt.

      Wie greife ich dann auf das Sessionarray zu? Mit $_SESSION['xyz'] oder $HTTP_SESSION_VARS['xyz']?

      Danke
      Frank

      1. Moin!

        1. register_globals gehört "off". Sorge dafür, dass dein Entwicklungssystem das so hat, und sorge ebenfalls dafür, dass das auf dem Liveserver so sein wird.

        Ich arbeite bereits mit register_globals off, online isses allerdings on...

        Das kann und sollte man ändern. Wenn es geht, nimm .htaccess:
        php_flag register_globals off

        Funktioniert dann, wenn PHP als Modul läuft. Ansonsten sprich deinen Provider drauf an, wenn du nicht an die php.ini drankommst, dass er es ausschalten möge.

        Für dein Entwicklungssystem bedeutet das: Error-Reporting auf E_ALL stellen und alle Notices, die von uninitialisierten Variablenbenutzungen berichten, beseitigen. Andernfalls kann man deinen Skripten potentiell böses antun.

        In deiner php.ini: error_reporting E_ALL
        Oder in jedem Skript: error_reporting(E_ALL);

        1. session_unregister() sollst du nicht benutzen. Ebenso session_register(). Beides ist dir verboten. Du kriegst durch Aufruf von session_start() das Array $_SESSION wiederhergestellt, und darin kannst du alle Werte abspeichern, die nach Skriptende gesichert werden sollen. Weitere Session-Funktionen (session_*()) benötigst du in 99% aller Fälle nicht.

        Ok danke, da habe ich einen Anhaltspunkt.

        Wie greife ich dann auf das Sessionarray zu? Mit $_SESSION['xyz'] oder $HTTP_SESSION_VARS['xyz']?

        Ich habe nur einen Variange geschrieben. Seit PHP 4.1.x sind alle $HTTP_irgendwas-Variablen überflüssig und sollten nicht mehr genutzt werden - sie werden irgendwann rausfliegen.

        - Sven Rautenberg

        1. Hallo,

          es funzt. Keine Fehlermeldung mehr.

          Danke
          Frank