Marco: Ich drehe durch :o) => Sessions Problem !!!

Hallo zusammen, ich habe einfach noch immer ein riiiesn Problem mit
den Sessions. Also es ist so:

Ich registriere auf der Seite die Sessions und zwar genau so:

@session_start();

session_register("anrede", "vorname", "adresse", "postfach", "plzort", "email", "spenden", "spendeart");

Wenn ich dann auf weiterklicke, und merke, dass ich zuvor z.b der Name falsch eingegeben habe, dann klicke ich auf zurück und will also denn Namen ändern. Jedoch das Problem ist, dass es dann die Variable nicht ändert !!!! Wieso geht das nicht, ich habe alles versucht :o(

hier sind mal die beiden seiten mit dem PHP-Code, die erste ist, wo man name usw. eingibt !!

http://www.email4u.ch/test/spenden/deutsch/spenden_formular_schritt2.txt

und diese wo dann die Sessions gespeichert werden :

http://www.email4u.ch/test/spenden/deutsch/spenden_formular_schritt3.txt

und hier noch das Link, wenn ihr es mal testen wollt, es ist die zweite seite. Wenn ihr dort denn namen usw einigbt und dann auf weiter klickt und auf der folgenden seite wieder zurück, und dann den namen änder, wir es nicht geändert !!!

http://www.email4u.ch/test/spenden/deutsch/spenden_formular.html

bitte um hilfe !! Vielen Dank !!

  1. Hallo,

    Hallo zusammen, ich habe einfach noch immer ein riiiesn Problem mit
    den Sessions.

    Deine Probleme sind in deinem Fall nicht die Sessions, sondern eher register_globals und Formularbehandlung.

    @session_start();

    session_register("anrede", "vorname", "adresse", "postfach", "plzort", "email", "spenden", "spendeart");

    Das funktioniert ja auch.

    Wenn ich dann auf weiterklicke, und merke, dass ich zuvor z.b der Name falsch eingegeben habe, dann klicke ich auf zurück und will also denn Namen ändern. Jedoch das Problem ist, dass es dann die Variable nicht ändert !!!! Wieso geht das nicht, ich habe alles versucht :o(

    1. Zum eigentlichen Thema: Du verwendest register_globals = on d.h. alle Eingaben werden in einer bestimmten Reihenfolge in globale Variablen geschrieben. Die Session-Variablen werden aus Sicherheitsgründen per default (und ich würde das nie im Leben abstellen) _nach_ den GET/POST-Variablen "importiert" (das geschieht übrigens bevor eine Zeile Deines Codes ausgeführt wird) Die Lösung: Du musst die Session Variablen anders nennen, als die Variablen, die Du im Formular verwendest.

    2. Folgendes ist mir aufgefallen (so als kleine Anregung): Dass Du die Variablen zumindest teilweise validierst (auf Gültigkeit prüfst) ist erfreulich. Eine feinere Überprüfung wäre vielleicht wünschenswert, aber das ist hier erst mal Nebensache. Das Problem ist: wenn ich bestimmte Felder leer lasse, dann sagt er mir, welche Felder ich leer gelassen habe und ich muss zurück. Aber typische, intuitive Formularbehandlung geht so:

    Wenn (Formular abgeschickt) {
      Wenn (Alle Eingaben korrekt) {
        Erfolgsmeldung / nächstes Formular
        Ende der Ausführung
      } Sonst {
        Fehlermeldung
        _kein Ende der Ausführung_
      }
    }
    Formular Anzeigen (mit den evtl. vom Benutzer schon übergebenen Werten)

    So wird das Formular im Fehlerfall nochmal mit den Eingaben angezeigt. (und der Benutzer muss nicht mit zurück wieder zum Formular springen)

    Grüße,

    Christian

    P.S.: in der </faq/> steht, wie man anklickbare Links macht.

    1. Hallo Christian,

      zuerst mal vielen Dank für Deine auführliche Hilfe, nun ich habe trozdem noch offene Fragen:

      Du hast geschrieben...

      -----------------
      1. Zum eigentlichen Thema: Du verwendest register_globals = on d.h. alle Eingaben werden in einer bestimmten Reihenfolge in globale Variablen geschrieben. Die Session-Variablen werden aus Sicherheitsgründen per default (und ich würde das nie im Leben abstellen) _nach_ den GET/POST-Variablen "importiert" (das geschieht übrigens bevor eine Zeile Deines Codes ausgeführt wird) Die Lösung: Du musst die Session Variablen anders nennen, als die Variablen, die Du im Formular verwendest.
      ------------------

      1. Die einstellung register_globals, ist wohl eine einstellung auf dem server oder? Da kann ich nicht viel ändern, aber wenn die Variablen ja schon global sind, dann sollte ich sie doch auch einfach auf 3 weiteren Seiten mit dem echo $test ansprechen können oder?

      2. Wie mache ich es denn dass ich nun die Variablen anders benenne? Also ich kann ja nicht einfach die Namen in

      session_register("anrede", "vorname", "adresse", "postfach", "plzort", "email", "spenden", "spendeart");

      ändern sonst weiss er ja gar nicht welchen wert er für die Sessions benötigt. Oder mach ich da einen Überlegungsfehler ?!?

      Freue mich auf Deine Hilfe !!

      1. Hallo,


        1. Zum eigentlichen Thema: Du verwendest register_globals = on d.h. alle Eingaben werden in einer bestimmten Reihenfolge in globale Variablen geschrieben. Die Session-Variablen werden aus Sicherheitsgründen per default (und ich würde das nie im Leben abstellen) _nach_ den GET/POST-Variablen "importiert" (das geschieht übrigens bevor eine Zeile Deines Codes ausgeführt wird) Die Lösung: Du musst die Session Variablen anders nennen, als die Variablen, die Du im Formular verwendest.

        1. Die einstellung register_globals, ist wohl eine einstellung auf dem server oder? Da kann ich nicht viel ändern,

        Korrekt. Das brauchst Du auch nicht.

        aber wenn die Variablen ja schon global sind, dann sollte ich sie doch auch einfach auf 3 weiteren Seiten mit dem echo $test ansprechen können oder?

        Die Variablen sind Global für das Script, das ausgeführt wird. Sessions dienen ja dazu, dass man sich Variablen "merken" kann.

        1. Wie mache ich es denn dass ich nun die Variablen anders benenne? Also ich kann ja nicht einfach die Namen in

        session_register("anrede", "vorname", "adresse", "postfach", "plzort", "email", "spenden", "spendeart");

        ändern sonst weiss er ja gar nicht welchen wert er für die Sessions benötigt. Oder mach ich da einen Überlegungsfehler ?!?

        Das kannst Du so lösen:

        Die Session Variablen heißen jetzt alle gesp_+Variablenname, also z.B. gesp_anrede. Dann musst Du nur noch folgendes machen:

        if (isset($anrede)) $gesp_anrede = $anrede;
        if (isset($vorname)) $gesp_vorname = $vorname;
        usw ...

        und danach den Aufruf:

        session_register("gesp_anrede", "gesp_vorname", "gesp_adresse", "gesp_postfach", "gesp_plzort", "gesp_email", "gesp_spenden", "gesp_spendeart");

        Grüße,

        Christian

        1. Lieber Christian

          1. Wow, mir bleibt die Sprache weg, aber wie hast du das herrausgefunden das es mit einem gesp_+Variablenname gespeichert wird?!?

          2. Das Script läuft dann auf einem anderen Server, dann habe ich ja wieder ein Problem oder?!?

          Freue mich auf Deine Antwort !!

          Die Session Variablen heißen jetzt alle gesp_+Variablenname, also z.B. gesp_anrede. Dann musst Du nur noch folgendes machen:

          if (isset($anrede)) $gesp_anrede = $anrede;
          if (isset($vorname)) $gesp_vorname = $vorname;
          usw ...

          und danach den Aufruf:

          session_register("gesp_anrede", "gesp_vorname", "gesp_adresse", "gesp_postfach", "gesp_plzort", "gesp_email", "gesp_spenden", "gesp_spendeart");

          1. Hallo,

            1. Wow, mir bleibt die Sprache weg, aber wie hast du das herrausgefunden das es mit einem gesp_+Variablenname gespeichert wird?!?

            Herausgefunden? Das hat eine ganz logische Erklärung (die ich auch gepostet habe) Zuerst leist sich PHP alle Wert ein, die es über GET (also die URL) bekommt. Danach alle, die über POST (also Formulare) kommen und überschreibt alle evtl schon vorhandenen Variablen. Dann kommen die Cookies dran (die wiederrum gnadenlos alle GET/POST-geschichten überschreiben) und danach die Session-Variablen (die wiederrum gnadenlos alles GET/POST/COOKIE-Zeugs überschreibt) So - wenn deine POST-Variable z.B. $anrede heißt, aber auch eine Session-Variable $anrede heißt, dann steht in $anrede der Wert der Session-Variable, da diese ja die POST-Variable überschreibt.

            1. Das Script läuft dann auf einem anderen Server, dann habe ich ja wieder ein Problem oder?!?

            Jein. Wenn _alle_ Skripte (bis auf vielleicht das, das das _allererste_ Formular anzeigt) auf dem anderen Server laufen, kein Problem

            Es sei denn, dieser Server hat register_globals auf off gestellt, aber dann hast du noch ganz andere Probleme - siehe http://de.php.net/manual/de/security.registerglobals.php

            Grüße,

            Christian

            P.S.: Vermeide bitte TOFU, das mögen wir hier gar nicht.

            1. Hallo,

              hmm habe es sicher nicht extra gemacht da ich nicht weiss was TOFU sind. Was ist das denn ?!? Christian, hast Du evt. ICQ, damit wenn noch mehr fragen auftauchen, ich dir rasch zu diesem Problem die Frage stellen kann. Natürlich nur zu diesem, neue Probleme poste ich dann wieder im Forum !! Wäre super !!

              Bis später !!

              Hallo,

              1. Wow, mir bleibt die Sprache weg, aber wie hast du das herrausgefunden das es mit einem gesp_+Variablenname gespeichert wird?!?

              Herausgefunden? Das hat eine ganz logische Erklärung (die ich auch gepostet habe) Zuerst leist sich PHP alle Wert ein, die es über GET (also die URL) bekommt. Danach alle, die über POST (also Formulare) kommen und überschreibt alle evtl schon vorhandenen Variablen. Dann kommen die Cookies dran (die wiederrum gnadenlos alle GET/POST-geschichten überschreiben) und danach die Session-Variablen (die wiederrum gnadenlos alles GET/POST/COOKIE-Zeugs überschreibt) So - wenn deine POST-Variable z.B. $anrede heißt, aber auch eine Session-Variable $anrede heißt, dann steht in $anrede der Wert der Session-Variable, da diese ja die POST-Variable überschreibt.

              1. Das Script läuft dann auf einem anderen Server, dann habe ich ja wieder ein Problem oder?!?

              Jein. Wenn _alle_ Skripte (bis auf vielleicht das, das das _allererste_ Formular anzeigt) auf dem anderen Server laufen, kein Problem

              Es sei denn, dieser Server hat register_globals auf off gestellt, aber dann hast du noch ganz andere Probleme - siehe http://de.php.net/manual/de/security.registerglobals.php

              Grüße,

              Christian

              P.S.: Vermeide bitte TOFU, das mögen wir hier gar nicht.

              1. Hallo,

                hmm habe es sicher nicht extra gemacht da ich nicht weiss was TOFU sind. Was ist das denn ?!?

                Dann sei Dir verzeihen ;)

                TOFU ist "Text oben, Fullquote unten"; hier im Forum achten wir auf den Zitierstil, der sich an den der Newsgroups anlehnt. Siehe dazu http://learn.to/quote/

                Christian, hast Du evt. ICQ,

                Nope - will ich nicht.

                damit wenn noch mehr fragen auftauchen, ich dir rasch zu diesem Problem die Frage stellen kann.

                Du kannst ruhig wieder hier im Forum posten. Aber als kleine Empfehlung: Im PHP-Handbuch (http://de.php.net/manual/de/) steht viel Wissenswertes über Variablen, register_globals und Sessions. Oft helfen auch die Notizen, die darunter stehen (sind halt leider nur auf Englisch).

                Grüße,

                Christian

                1. Ach so jetzt weiss ich auch was TOFU ist, dachte zuerst es ist was zum essen :o)

                  Nun also, ich versuche jetzt mal die Variiante mit dem

                  gesp_vorname usw. ist es dann aber möglich wenn ich die Variable ändere also denn Text, dass dann die Sessions auch geändert resp. überschrieben wird oder?!?

                  Nochmals danke für die super erläuterungen auch das mit den Post / GET / Sessions => einfach super !!

                  Hallo,

                  hmm habe es sicher nicht extra gemacht da ich nicht weiss was TOFU sind. Was ist das denn ?!?

                  Dann sei Dir verzeihen ;)

                  TOFU ist "Text oben, Fullquote unten"; hier im Forum achten wir auf den Zitierstil, der sich an den der Newsgroups anlehnt. Siehe dazu http://learn.to/quote/

                  Christian, hast Du evt. ICQ,

                  Nope - will ich nicht.

                  damit wenn noch mehr fragen auftauchen, ich dir rasch zu diesem Problem die Frage stellen kann.

                  Du kannst ruhig wieder hier im Forum posten. Aber als kleine Empfehlung: Im PHP-Handbuch (http://de.php.net/manual/de/) steht viel Wissenswertes über Variablen, register_globals und Sessions. Oft helfen auch die Notizen, die darunter stehen (sind halt leider nur auf Englisch).

                  Grüße,

                  Christian

                  1. Hallo, <-- Anrede nicht vergessen

                    Ach so jetzt weiss ich auch was TOFU ist, dachte zuerst es ist was zum essen :o)

                    daher könntest Du's jetzt bleiben lassen

                    Nun also, ich versuche jetzt mal die Variiante mit dem gesp_vorname usw. ist es dann aber möglich wenn ich die Variable ändere also denn Text, dass dann die Sessions auch geändert resp. überschrieben wird oder?!?

                    Das wird sie auch. Schau dir mal den Quelltext noch mal an. Da steht:

                    if (isset($vorname)) $gesp_vorname = $vorname;
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^

                    Daraus folgt: Die Session Variable ($gesp_vorname) wird immer mit der POST-Variable ($vorname) überschrieben, falls jene gesetzt ist (isset). Klar?

                    Grüße,  <-- Grußformel nicht vergessen

                    Christian

                    1. Hallo Chritian,

                      wow, ich lerne ja richtig viel von Dir, also darf ich sicher noch was fragen :o) nun ich habe ein weiteres Problem,

                      Obwohl ich die Session registriert habe und auch auf einer vorderen Seite zur ansicht bekomme, kommt sie plötzlich auf einer weitern seite nicht mehr :o( dabei schreibe ich das

                      @session_start();

                      echo "$anrede";

                      warum kommt Sie nicht mehr ?!?

                      Gruss Marco

                      Hallo, <-- Anrede nicht vergessen

                      Ach so jetzt weiss ich auch was TOFU ist, dachte zuerst es ist was zum essen :o)

                      daher könntest Du's jetzt bleiben lassen

                      Nun also, ich versuche jetzt mal die Variiante mit dem gesp_vorname usw. ist es dann aber möglich wenn ich die Variable ändere also denn Text, dass dann die Sessions auch geändert resp. überschrieben wird oder?!?

                      Das wird sie auch. Schau dir mal den Quelltext noch mal an. Da steht:

                      if (isset($vorname)) $gesp_vorname = $vorname;
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^

                      Daraus folgt: Die Session Variable ($gesp_vorname) wird immer mit der POST-Variable ($vorname) überschrieben, falls jene gesetzt ist (isset). Klar?

                      Grüße,  <-- Grußformel nicht vergessen

                      Christian

                    2. Hallo Christian,

                      du glaubst es nicht, aber das mit dem isset geht nicht !!
                      Schau mal hier wie ich es gemacht habe !!

                      if (isset($anrede)) $gesp_anrede = $anrede;
                      if (isset($vorname)) $gesp_vorname = $vorname;

                      //Sessions beschreiben !!

                      @session_start();

                      session_register("gesp_anrede", "gesp_vorname", "gesp_adresse", "gesp_postfach", "gesp_plzort", "gesp_email", "gesp_spenden", "gesp_spendeart");

                      echo "$gesp_anrede";

                      wenn ich dann auf zurück klicke un dort z.b statt Herr, Familie auswähle kommt immer noch das gleiche :o(

                      WARUM ?!

                      Gruss Marco

                      1. Hallo,

                        wenn ich dann auf zurück klicke un dort z.b statt Herr, Familie auswähle kommt immer noch das gleiche :o(

                        WARUM ?!

                        Keine Ahnung. Müsste klappen. Der Name der Formularelemente muss aber weiterhin anrede (und *nicht* gesp_anrede) sein, nur die Session Variablen sollten so heißen. Wenn's das nicht ist, dann steckt irgendwo noch der Fehlerteufel ... (hab' leider keine Zeit mehr, ihn zu suchen)

                        Grüße,

                        Christian

                        [der jetzt leider gehen muss]

                      2. Moin!

                        du glaubst es nicht, aber das mit dem isset geht nicht !!
                        Schau mal hier wie ich es gemacht habe !!

                        Die in der Session gespeicherten Variablen stehen erst dann zur Verfügung, wenn der Befehl session_start() gegeben wurde. Das bedeutet: Erst danach kannst du auf in der Session gespeicherte Variablen zurückgreifen, und erst _danach_ macht es Sinn, den in der Session gespeicherten Variablen einen neuen Wert zuzuweisen.

                        - Sven Rautenberg

                        1. Ja schon klar ich habe die sessions auch zuvor gestartet aber es geht trozdem nicht... Uff ich will doch nur einen neuen wert z.b vorname dann ändern !!

                          Was mache ich falsch, kannst du nicht rasch aufschreiben wie du das machen würdest... Wäre nett !!

                          Moin!

                          du glaubst es nicht, aber das mit dem isset geht nicht !!
                          Schau mal hier wie ich es gemacht habe !!

                          Die in der Session gespeicherten Variablen stehen erst dann zur Verfügung, wenn der Befehl session_start() gegeben wurde. Das bedeutet: Erst danach kannst du auf in der Session gespeicherte Variablen zurückgreifen, und erst _danach_ macht es Sinn, den in der Session gespeicherten Variablen einen neuen Wert zuzuweisen.

                          • Sven Rautenberg