paco: POST-Daten mit Schleife in Variablen mit Feldnamen schreiben

Guten Morgen!
Ich habe das Problem, dass ich, nachdem ich in der php.ini register-globals auf off gestellt habe meine skripte überarbeiten muß und nicht mehr ohne weiteres auf meine per POST übergebenen Daten zugreifen kann.

Da ich Formulare mit sehr vielen Feldern auswerten will, würde ich gerne am Anfang des Skripts mit einer Schleife alle Daten aus dem POST-Array in Variablen mit dem entsprechenden Feldnamen schreiben, krieg das aber nicht hin.

Also
$a = $_POST['a'];
$b = $_POST['b'];

Etwa so:

foreach($_POST as $key => $value) {
$$key = $value;
}

Das funktioniert aber leider nicht. Gibts da gar eine schlaue Funktion die das tut?

Kann ja eigentlich nicht so schwer sein, aber ich komm nicht drauf..

Vielen Dank schonmal,

Paco

  1. $a = $_POST['a'];
    $b = $_POST['b'];

    Was soll das für einen Sinn haben? Du verschleierst nur die Herkunft der Variablen und machst das Script unübersichtlich.

    1. $a = $_POST['a'];
      $b = $_POST['b'];

      Was soll das für einen Sinn haben? Du verschleierst nur die Herkunft der Variablen und machst das Script unübersichtlich.

      Das hat den Sinn, dass ich im script, wo bisher

      echo 'Variable a: ' . $a;

      stand nicht überall

      echo 'Variable a: ' . $_POST['a'];

      schreiben muß

      1. Du verschleierst nur die Herkunft der Variablen und machst das Script unübersichtlich.

        Das hat den Sinn, dass ich im script, wo bisher

        echo 'Variable a: ' . $a;

        stand nicht überall

        echo 'Variable a: ' . $_POST['a'];

        schreiben muß

        Siehe oben.

        1. Du verschleierst nur die Herkunft der Variablen und machst das Script unübersichtlich.

          Das hat den Sinn, dass ich im script, wo bisher

          echo 'Variable a: ' . $a;

          stand nicht überall

          echo 'Variable a: ' . $_POST['a'];

          schreiben muß

          Siehe oben.

          Was genau meinst du mit "siehe oben"?

          Und falls Du damit Deinen Hinweis auf Herkunft und Übersichtlichkeit meinst, den habe ich schon beim ersten mal verstanden.

          Möchte echt nicht undankbar erscheinen, aber ein Tip wie ich das hinbekomme wär mir schon lieber, als ein wiederholter Hinweis darauf dass es besser geht, ohne zu sagen wie..

          Noch jemand ne Idee? Habe noch woanders die Variante

          foreach($_POST as $key => $value) {
          ${$key} = $value;
          }

          gefunden, aber bei mir sind die Variablen nach der Schleife immer noch leer..

          1. Hi,

            Möchte echt nicht undankbar erscheinen, aber ein Tip wie ich das hinbekomme wär mir schon lieber, als ein wiederholter Hinweis darauf dass es besser geht, ohne zu sagen wie..

            es geht besser, indem Du $_POST['name'] anstatt $name schreibst.

            [...] bei mir sind die Variablen nach der Schleife immer noch leer..

            Das ist gut so.

            Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt? Es ist mir gerade nicht wichtig genug, um es zu testen ;-) aber vielleicht weiß es ja jemand auf Anhieb.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt? Es ist mir gerade nicht wichtig genug, um es zu testen ;-) aber vielleicht weiß es ja jemand auf Anhieb.

              Ich weiß es nicht, ich gehe aber mal davon aus, dass es ein Mehrdimensionales array mit absoluterlichen namen gibt

              $_POST['_POST'][0]; oder vergleichbares ;)

            2. Hallo,

              Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt?

              dann fällt das Script, das daraus "einfache" Variablen generieren will, auf die Schnauze.

              Natürlich ist es kein Problem, wenn das $_POST-Array nochmal ein Element mit dem Namen "_POST" hat. Aber wenn man mit der skizzierten Schleife darüber herfällt und über die bösen variablen Variablen etwas Neues generiert, überschreibt man an dieser Stelle das ursprüngliche $_POST-Array.
              Pflatsch. :-)

              So long,
               Martin

              --
              "Hier steht, deutsche Wissenschaftler hätten es im Experiment geschafft, die Lichtgeschwindigkeit auf wenige Zentimeter pro Sekunde zu verringern." - "Toll. Steht da auch, wie sie es gemacht haben?" - "Sie haben den Lichtstrahl durch eine Behörde geleitet."
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hi,

                Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt?

                dann fällt das Script, das daraus "einfache" Variablen generieren will, auf die Schnauze.

                danke, das hatte ich vermutet und gehofft - dann bleibt das Erleben dieses Umstands als Übung für zuhause ;-)

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
              2. Hi Martin.

                Aber wenn man mit der skizzierten Schleife darüber herfällt und über die bösen variablen Variablen etwas Neues generiert, überschreibt man an dieser Stelle das ursprüngliche $_POST-Array.

                Bis hierhin ACK.

                Pflatsch. :-)

                Aber Pflatsch machts nicht :-)

                Das _Post-Array wird überschrieben, das beeinflusst die Iteration aber nicht (die läuft über eine Kopie des ursprünglichen _POST-Arrays). Wenn man das ursprüngliche _POST-Array nicht mehr braucht - und das ist ja der Zweck des Ganzen - dann macht dieser Umstand keine zusätzlichen Probleme (mit Betonung auf "zusätzlichen", ich will hier keine Argumente für so eine Kopierorgie liefern :-)).

                Viele Grüße,
                der Bademeister

                1. Moin,

                  [...] überschreibt man an dieser Stelle das ursprüngliche $_POST-Array.
                  Bis hierhin ACK.

                  Pflatsch. :-)
                  Aber Pflatsch machts nicht :-)

                  Das war das Auf-die-Schnauze-fallen.

                  Das _Post-Array wird überschrieben, das beeinflusst die Iteration aber nicht (die läuft über eine Kopie des ursprünglichen _POST-Arrays).

                  Kannst du das irgendwie belegen? - Ich fürchte nämlich, du hast da etwas missverstanden.
                  Mir ist zwar bekannt, dass foreach mit Kopien operiert - aber das gilt AFAIK nur für die Schleifenvariablen.

                  foreach ($matrix as $key => $value)  
                   { ...  
                     $matrix[$key] = 0;  
                   }
                  

                  Hier sind $key und $value im Schleifenkörper zwar Kopien des aktuellen Elements und seines Schlüssels aus $matrix, aber die Zuweisung an $matrix[] erfolgt direkt.

                  Ich habe so eine Konstruktion schon verwendet, um innerhalb der foreach-Schleife das Array, mit dem ich arbeite, zu verändern. Dass es keine nachhaltige Wirkung hat, $value in der Schleife zu verändern, habe ich gemerkt - und später gelesen, dass das so richtig ist. Darum die scheinbar umständliche Adressierung.

                  So long,
                   Martin

                  --
                  Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hier sind $key und $value im Schleifenkörper zwar Kopien des aktuellen Elements und seines Schlüssels aus $matrix, aber die Zuweisung an $matrix[] erfolgt direkt.

                    Ja. Es wird ja auch tatsaechlich das echte _POST-Array ueberschrieben. Aber was immer Du genau mit

                    dann fällt das Script [...] auf die Schnauze.

                    meinst, wird nicht passieren. Weder die laufende foreach-Iteration ueber _POST, noch irgendwas danach wird von dieser Ueberschreibung gestoert (sofern das Skript danach nicht mehr versucht, auf die uerspruenglichen _POST-Werte zuzugreifen, was ja der Sinn des Ganzen ist).

                    Im Grunde ist _POST mehr oder weniger der unproblematischste Name, den man hier einem Formularelement nur geben kann, weil es der einzige ist, bei dem man nicht Gefahr laeuft, ne Variable zu ueberschreiben, die tatsaechlich noch weiter hinten im Skript vorkommt :-)

                    Viele Gruesse,
                    der Bademeister

                    1. Hallo,

                      Hier sind $key und $value im Schleifenkörper zwar Kopien des aktuellen Elements und seines Schlüssels aus $matrix, aber die Zuweisung an $matrix[] erfolgt direkt.
                      Ja. Es wird ja auch tatsaechlich das echte _POST-Array ueberschrieben. Aber was immer Du genau mit

                      dann fällt das Script [...] auf die Schnauze.

                      meinst, wird nicht passieren.

                      doch, selbstverständlich. Die ersten paar Schleifendurchläufe funktionieren noch so, wie sich der Programmierer das vorgestellt haben mag, dann wird das $_POST-Array überschrieben. Ob die foreach-Schleife als Reaktion darauf abbricht oder an einer (un?)definierten Stelle weitermacht, weiß ich nicht - aber in jedem Fall sind die POST-Parameter verloren, die bis dahin noch nicht umkopiert wurden. Und das dürfte zur Folge haben, dass das Script nicht mehr wie vorgesehen funktioniert.

                      Schönes Wochenende,
                       Martin

                      --
                      Gott hilft niemandem, er erfreut sich nur an unseren Leiden.
                        (Ashura)
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      1. Ob die foreach-Schleife als Reaktion darauf abbricht oder an einer (un?)definierten Stelle weitermacht, weiß ich nicht

                        Was muss ich denn tun, damit Du mir glaubst? :-)

                        aber in jedem Fall sind die POST-Parameter verloren, die bis dahin noch nicht umkopiert wurden.

                        Es wird *am Anfang* einer foreach-Iteration eine Kopie des gesamten Arrays angelegt, ueber die dann iteriert wird. Diese Kopie kriegt dann nichts davon mit, dass am Original-Array irgendetwas rumgefummelt wird.

                        Viele Gruesse,
                        der Bademeister

                        1. Hallo,

                          Ob die foreach-Schleife als Reaktion darauf abbricht oder an einer (un?)definierten Stelle weitermacht, weiß ich nicht
                          Was muss ich denn tun, damit Du mir glaubst? :-)
                          Es wird *am Anfang* einer foreach-Iteration eine Kopie des gesamten Arrays angelegt, ueber die dann iteriert wird. Diese Kopie kriegt dann nichts davon mit, dass am Original-Array irgendetwas rumgefummelt wird.

                          aaah, jetzt habe ich a) tatsächlich verstanden, wie du das mit der Kopie gemeint hast; b) konnte ich es nicht glauben; c) habe ich es eben ausprobiert; und d) habe ich fassungslos festgestellt, dass es tatsächlich so ist, wie du es darstellst.

                          Die Zuweisung innerhalb der Schleife geht also direkt ans Original-Array, gelesen wird aber immer noch aus einer Kopie.
                          Hey, wie hinterhältig ist das denn?!

                          Schönes Wochenende,
                           Martin

                          --
                          Wer mit dem Finger droht, sollte ihn am Abzug haben, und nicht in der Nase.
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                          1. Hi!

                            Die Zuweisung innerhalb der Schleife geht also direkt ans Original-Array, gelesen wird aber immer noch aus einer Kopie.
                            Hey, wie hinterhältig ist das denn?!

                            Gar nicht, works as documented.

                            Lo!

            3. es geht besser, indem Du $_POST['name'] anstatt $name schreibst.

              Hmpf. Das hab ich mir schon auch noch erschlossen..

              [...] bei mir sind die Variablen nach der Schleife immer noch leer..

              Das ist gut so.

              find ich nicht

              Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt? Es ist mir gerade nicht wichtig genug, um es zu testen ;-) aber vielleicht weiß es ja jemand auf Anhieb.

              Cheatah

              Nun gut, ich beuge mich den Empfehlungen der Forums-Weisen. Sind allerdings ca 15 Seiten mit jeweils bis zu 40 Variablen, deswegen habe ich die billige Lösung gesucht, aber ich bin ja bemüht mit der Zeit etwas saubereren Code zu produzieren.

              @Der Martin:
              So alt ist das Script garnicht, aber analog mit meinen Programmierfähigkeiten gewachsen. und ja, ich bin sicher, dass es noch die ein oder andere Sünde enthält, bei der sich Dir die Fußnägel aufrollen würden ;-)

              Vielen Dank auf jeden Fall,

              Paco

              P.S.: Was genau macht denn z.B. die php-Funktion extract? Ist das nicht eigentlich das was ich gesucht habe?

              1. P.S.: Was genau macht denn z.B. die php-Funktion extract? Ist das nicht eigentlich das was ich gesucht habe?

                Jein - es macht bei einer flachen Struktur etwa das was du möchtest, es ist aber bei mehrdimensionalen Strukturen unhandlich und bei nicht vertrauenswürdigem Inhalt sogar potentiell gefärlich. Es ist dafür geeignet Assoziative Arrays in Variablen zu zerlegen - warum man das auch immer benötigen sollte - das ist etwa genauso schlimm wie variable Variablen.

                Es ist aber _ausdrücklich_ nicht schlau, das auf $_POST oder $_GET anzuwenden.

                1. Es ist aber _ausdrücklich_ nicht schlau, das auf $_POST oder $_GET anzuwenden.

                  Schlimm ist das mit euch Schlaubergern! Immer hat man hinterher was gelernt, sieht aber erstmal was man vorher überhaupt fürn Mist gemacht hat und hat furchtbar viel Arbeit ;-)

                  1. Es ist aber _ausdrücklich_ nicht schlau, das auf $_POST oder $_GET anzuwenden.

                    Schlimm ist das mit euch Schlaubergern!

                    Das hat weniger mit "Schlaubergerei" zu tun sondern einfach damit, dass man die Dokumentationsseite einer Funktion lesen sollte (besonders die roten Kästen mit "Warning" darüber) bevor man entscheidet, ob man eine Funktion verwenden sollte :)

                    Immer hat man hinterher was gelernt, sieht aber erstmal was man vorher überhaupt fürn Mist gemacht hat und hat furchtbar viel Arbeit ;-)

                    Und das Beste daran: das wird nie aufhören, egal wieviel du dazu lernst - den Code den du 6 Monate zuvor produziert hast, willst du danach immer in die Tonnen treten und am liebsten neu schreiben :D

            4. Hi!

              Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt?

              Du meinst vermutlich das Verhalten, wenn register_globals auf on steht. Nun, diese Sicherheitslücke wurde schon lange gefixt. $GLOBALS und $_GET lassen sich definitiv nicht via register_globals überschreiben, die anderen werden sich vermutlich auch dagegen wehren.

              Lo!

              1. Hi,

                Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt?

                Du meinst vermutlich das Verhalten, wenn register_globals auf on steht.

                nein, register_globals ist uninteressant. Ich meine, wenn man wie der OP versucht, etwas Dergestaltes zu simulieren.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hi!

                  Frage an die Allgemeinheit: Was passiert eigentlich bei solchen Dingen, wenn jemand vor dem Absenden des Formulars einem Eingabefeld den Namen "_POST" bzw. "_POST[]" gibt?
                  Du meinst vermutlich das Verhalten, wenn register_globals auf on steht.
                  nein, register_globals ist uninteressant. Ich meine, wenn man wie der OP versucht, etwas Dergestaltes zu simulieren.

                  Ah, ok. Innerhalb des Scripts kann man die vorgegebenen Variablen (wie $_GET/$_POST) beliebig überschreiben. Man kann ihnen auch skalare Werte zuweisen. Aber abgesehen vom skalaren Wert sind die Auswirkungen von register_globals und der Nachbildung ziemlich gleich.

                  Lo!

      2. Hallo,

        $a = $_POST['a'];
        $b = $_POST['b'];
        Was soll das für einen Sinn haben? Du verschleierst nur die Herkunft der Variablen und machst das Script unübersichtlich.

        Das hat den Sinn, dass ich im script, wo bisher
            echo 'Variable a: ' . $a;
        stand nicht überall
            echo 'Variable a: ' . $_POST['a'];
        schreiben muß

        schon klar, aber warum möchtest du die eigentlich bessere Version, nämlich direkt auf die POST-Daten zuzugreifen, nicht haben? Ist es der Arbeitsaufwand beim Umschreiben? - Jeder Editor beherrscht Search/Replace, einige sogar dateiübergreifend (wobei letzteres hier vermutlich nicht hilft). Die Anzahl der POST-Parameter dürfte ja nicht so riesig sein, also ist ein halbes Dutzend S/R-Vorgänge wahrscheinlich ausreichend. Also eine Sache von fünf Minuten.

        Abgesehen davon lohnt es sich aber ganz bestimmt, die Änderungen händisch vorzunehmen und die Scripte aufmerksam durchzuforsten. Denn ein Script, das so alt ist, dass es sich noch auf register_globals verlässt, enthält wahrscheinlich noch viel schlimmere Sünden. Ich denke da in erster Linie an missachtete Kontextwechsel und mangelhafte (oder fehlende) Fehlerüberprüfung.

        So long,
         Martin

        --
        Verliebt:    Er spricht, sie lauscht.
        Verlobt:     Sie spricht, er lauscht.
        Verheiratet: Beide sprechen, und die Nachbarn lauschen.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hi!

    Ich habe das Problem, dass ich, nachdem ich in der php.ini register-globals auf off gestellt habe meine skripte überarbeiten muß und nicht mehr ohne weiteres auf meine per POST übergebenen Daten zugreifen kann.
    Da ich Formulare mit sehr vielen Feldern auswerten will, würde ich gerne am Anfang des Skripts mit einer Schleife alle Daten aus dem POST-Array in Variablen mit dem entsprechenden Feldnamen schreiben, krieg das aber nicht hin.

    Wenn du das wirklich willst, dann lass register_globals eingeschaltet, das hat exakt den gleichen Effekt.

    Die Frage ist daher, warum du register_globals ausschaltest und trotzdem dessen Verhalten nachbilden willst?

    foreach($_POST as $key => $value) {
    $$key = $value;
    }
    Das funktioniert aber leider nicht.

    Definiere "funktioniert nicht".

    Gibts da gar eine schlaue Funktion die das tut?

    Nein, eine schlaue Funktion für dieses nicht sinnvolle Anliegen kann es nicht geben. Aber du findest eine Funktion in den Variable handling Functions.

    Lo!

    1. Hello,

      Nein, eine schlaue Funktion für dieses nicht sinnvolle Anliegen kann es nicht geben. Aber du findest eine Funktion in den Variable handling Functions.

      Die Funktion findet er zwar unter den Array-Funktionen
      http://de.php.net/manual/en/function.extract.php
      aber dass die stumpfe Benutzung der Funktion nicht sonderlich schlau ist, da bin ich Deiner Meinung.

      Warum sollte ich etwas, was wunderschön zusammengebaut ist, woran ich einen schönen Griff habe, zerstückeln, den Griff wegschmeißen und muss dann die einzelnen Stücke mühselig wieder zusammensuchen?

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Nein, eine schlaue Funktion für dieses nicht sinnvolle Anliegen kann es nicht geben. Aber du findest eine Funktion in den Variable handling Functions.

        Die Funktion findet er zwar unter den Array-Funktionen
        http://de.php.net/manual/en/function.extract.php
        aber dass die stumpfe Benutzung der Funktion nicht sonderlich schlau ist, da bin ich Deiner Meinung.

        Ich bin mir ziemlich sicher, dass import_request_variables() gemeint war - aber da kann man die Globals gleich wieder einschalten.