Franz: mehrdimensionales array in einem input möglich?

Hallo,

mein Problem als Laie ist folgendes:
Ich habe ein Eingabeformular ( DATALIST ), dessen Option values per php aus einer Tabelle gefüllt werden. Es kann also ein aus der Tabelle gefüllter Wert ausgewählt werden, oder ein eigener eingegeben werden. Funktioniert mit einem Wert auch.
Ich möchte nun aber mit der Auswahl eines Tabellenwertes bewirken, dass 2 Felder aus dem Datensatz übernommen werden, z.bsp Ort und Strasse.
Ich kann zwar mit   <input type="text" name="feld[]"  ... /> ein array für die $_POST Übernahme erstellen, aber anscheinend nicht mehrdimensional.

Ich möchte bei Auswahl einer Option gern folgendes Ergebnis im Array feld stehen haben (als Bsp):
feld[0]['ort'] = "Bonn"
feld[0]['Strasse'] = "Heideweg"

Allerdings krieg ich es auch nicht hin, als <option Value = .... ein array zu verwenden.

Ist so etwas denn überhaupt möglich, oder bin ich grundsätzlich auf dem Holzweg?

(Nach 2 Tagen erfolglosem googeln und Foren lesen bin ich für jeden Tipp dankbar)

  1. Hi,

    Ich möchte bei Auswahl einer Option gern folgendes Ergebnis im Array feld stehen haben (als Bsp):
    feld[0]['ort'] = "Bonn"
    feld[0]['Strasse'] = "Heideweg"

    Allerdings krieg ich es auch nicht hin, als <option Value = .... ein array zu verwenden.

    Ist so etwas denn überhaupt möglich, oder bin ich grundsätzlich auf dem Holzweg?

    Nein, das ist nicht möglich, da eine option nur *ein* value haben kann.

    Entweder übergibst du lediglich eine id, die einen serverseitigen Datensatz identifiziert – oder, wenn du wirklich mehrere Werte übergeben *musst*, fasst du sie zu *einem* Wert zusammen, indem du sie zu einem String-Wert serialisiert. Dann musst du aber u.U. vorsichtig sein beim anschließenden serverseitigen de-serialisieren des übergebenen, möglicherweise manipulierten Wertes – z.B. PHPs serialize/unserialize zu verwenden, wird nicht empfohlen. JSON als Datenformat wäre an so einer Stelle eine bessere Wahl.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
    1. Liebe Mitdenker,
      liebe Wissende,
      liebe Neugierige,

      ja!

      Nein, das ist nicht möglich, da eine option nur *ein* value haben kann.

      Besser: weil ein <input> nur einen Namen haben kann. Ich erinnere mich grob, dass man als get-parameter auch arrays übertragen kann, oder irre ich mich da jetzt?

      Die kann man aber (als array) nicht mit einem input-element erzeugen.

      Spirituelle Grüße
      Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
      1. Hallo,

        Ich erinnere mich grob, dass man als get-parameter auch arrays übertragen kann, oder irre ich mich da jetzt?

        ja, du irrst dich. Auch GET-Parameter (URL-Paramter) sind nur einzelne String-Werte. Zwar kann man mehrere gleichnamige URL-Parameter verwenden; wie die ausgewertet werden, bleibt der serverseitigen Logik überlassen.

        Speziell PHP bietet auch die Möglichkeit, ein Array aus gleichnamigen URL-Parametern zu erzeugen, indem man deren Namen mit eckigen Klammern [] enden lässt. Das heißt aber nicht, dass ein Array als URL-Parameter übertragen wird, das wäre falsch ausgedrückt.

        Die kann man aber (als array) nicht mit einem input-element erzeugen.

        Nein, aber mit mehreren.

        Ciao,
         Martin

        --
        Datenbanken speichern keine User.
        Das liegt daran, daß Datenbanken mit der Lebensmittelversorgung für gespeicherte biologische Lebensformen derzeit noch Probleme haben.
          (Christoph Schnauß)
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Liebe Mitdenker,
          liebe Wissende,
          liebe Neugierige,

          ja!

          ja, du irrst dich. Auch GET-Parameter (URL-Paramter) sind nur einzelne String-Werte. Zwar kann man mehrere gleichnamige URL-Parameter verwenden; wie die ausgewertet werden, bleibt der serverseitigen Logik überlassen.

          Speziell PHP bietet auch die Möglichkeit, ein Array aus gleichnamigen URL-Parametern zu erzeugen, indem man deren Namen mit eckigen Klammern [] enden lässt. Das heißt aber nicht, dass ein Array als URL-Parameter übertragen wird, das wäre falsch ausgedrückt.

          Das war mir schon klar. Leider konnte ich es mobil nicht ausprobieren und auch nicht so schnell recherchieren. Es muss sich dazu aber ein Beitrag in diesem Archiv befinden. Ich meine, dass jemand, der sich Globe nannte, das mal im Rahmen einer Diskussion um Register Globals und Sicherheit gezeigt hat, dass es da eine "Hintertür" bei PHP gab. Irgendwas mit geschweiften Klammern habe ich verschwommen noch im Gedächtnis. Das war aber noch zu PHP-4-Zeiten.

          Die kann man aber (als array) nicht mit einem input-element erzeugen.

          Nein, aber mit mehreren.

          Ja.

          Spirituelle Grüße
          Euer Robert

          --
          Möge der Forumsgeist wiederbelebt werden!
    2. Tach!

      Entweder übergibst du lediglich eine id, die einen serverseitigen Datensatz identifiziert – oder, wenn du wirklich mehrere Werte übergeben *musst*, fasst du sie zu *einem* Wert zusammen, indem du sie zu einem String-Wert serialisiert. Dann musst du aber u.U. vorsichtig sein beim anschließenden serverseitigen de-serialisieren des übergebenen, möglicherweise manipulierten Wertes – z.B. PHPs serialize/unserialize zu verwenden, wird nicht empfohlen. JSON als Datenformat wäre an so einer Stelle eine bessere Wahl.

      Was genau ist denn die Begründung, die eine Serialisierungsart der anderen vorzuziehen?

      dedlfix.

      1. Hi,

        Dann musst du aber u.U. vorsichtig sein beim anschließenden serverseitigen de-serialisieren des übergebenen, möglicherweise manipulierten Wertes – z.B. PHPs serialize/unserialize zu verwenden, wird nicht empfohlen. JSON als Datenformat wäre an so einer Stelle eine bessere Wahl.

        Was genau ist denn die Begründung, die eine Serialisierungsart der anderen vorzuziehen?

        unserialize kann u.U. PHP-Objekte zu vorhandenen Klassen instantiieren.
        Mit dekodiertem JSON ist das m.W. nicht möglich.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
        1. Tach!

          unserialize kann u.U. PHP-Objekte zu vorhandenen Klassen instantiieren.
          Mit dekodiertem JSON ist das m.W. nicht möglich.

          JSON kennt keinen Klassennamen, insofern kann man auch nur allgemeine Objekte daraus erstellen. Um mit PHPs unserialize() gezielt Objekte andere Klassen als vorgesehen zu erstellen, ist möglich. Aber um das ausnutzen zu können, muss man Wissen über den Code haben, um einen existierenden Klassennamen zu bekommen und diese Klasse muss dann auch noch gleichnamige Methoden haben, die im weiteren Verlauf von der anderen Klasse hätten aufgerufen werden sollen. Wenn die nun tun, was man als Angreifer will, hat man gewonnen. Das ist aber kein ganz einfaches Unterfangen. Besser als solche wichtigen Daten manipulierbar über den Client zu schleifen ist dann doch Alternativen zu suchen, beispielsweise serverseitige Sessions.

          dedlfix.

    3. Hi,

      Entweder übergibst du lediglich eine id, die einen serverseitigen Datensatz identifiziert – oder, wenn du wirklich mehrere Werte übergeben *musst*, fasst du sie zu *einem* Wert zusammen, indem du sie zu einem String-Wert serialisiert. Dann musst du aber u.U. vorsichtig sein beim anschließenden serverseitigen de-serialisieren des übergebenen, möglicherweise manipulierten Wertes – z.B. PHPs serialize/unserialize zu verwenden, wird nicht empfohlen. JSON als Datenformat wäre an so einer Stelle eine bessere Wahl.

      Etwas genauer: Es braucht einen Serializer, der sowohl clientseitig (JS) als auch serverseitig (PHP, Perl) zur Verfügung steht. Damit stehen client- wie serverseitig quasi dieselben Datenstrukturen (JS::Object, Perl::Hash, PHP::Array) zur Verfügung und die Übertragung wird transparent.

      MfG

  2. Liebe Mitdenker,
    liebe Wissende,
    liebe Neugierige,

    ja!

    Im Document:

    <form method ... >
    <input type="text" name="feld[0][ort]"  ... >
    <input type="text" name="feld[0][strasse]"  ... >
    <input type="submit" name="button[speichern]" ... >
    </form>

    Im Skript:

    echo "<pre>\r\n";
    echo htmlspecialchars(print_r($_POST,1),ENT_QUOTES);
    echo "</pre>\r\n";

    <select multiple> kann auch mehrere Werte übertragen. Php macht dann ein Array daraus, wenn du als Namen Arraybezeichner benutzt. Im <input> aberdie Bezeichner ohne Quotierung in den []-Klammern schreiben

    Spirituelle Grüße
    Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!
  3. Vielen Dank für die schnellen Antworten. Zwar schade, aber was solls.
    Der Tipp, eine eindeutige ID zu übergeben, bringt bei meiner Grundüberlegung nichts.
    Ich habe ja die Datalist-Variante gewählt, weil ich die Möglichkeit geben will, um bei einem nicht existierenden Tabelleneintrag trotzdem im selben Feld eine Dateneingabe zu ermöglichen und somit einen neuen Wert erzeugen zu können.
    Werde ich eben mit 2 Feldern arbeiten müssen.
    Statt über 2 Felder eine Ort und Strasse einzugeben, wollte ich die beiden Felder bei einer bereits existierenden Kombination über ein Eingabefeld abwickeln. Existiert eine Kombination teilweise oder ganz nicht, muss ohnehin die Eingabe über 2 Input Felder erfolgen.
    Natürlich könnte ich folgendes machen:
    Als Option eine Kombination aus ID / Ort / Strasse anzeigen und bei einer gewählten existierende Option die ID übergeben (Womit ich später ja die Kombination Ort & Strasse wieder finde), sieht aber blöd aus, weil nach der Auswahl dann die ID im Feld Ort steht.
    Oder, wie manche Anwender sagen: "Wenn DAS die Lösung ist, dann hätte ich gern mein Problem wieder".
    Zum anderen, wenn eine Kombination nicht existiert, gibt der User ja ggf einen neuen Ortsnamen ein. D.h. ich müsste später prüfen, ob der mit $_POST erhaltene Wert jetzt ein Ortsname oder eine ID ist.
    Machbar wäre vieles, aber in diesem Fall ist es wohl besser grundsätzlich über 2 Input Felder zu gehen.

    1. Hi,

      Als Option eine Kombination aus ID / Ort / Strasse anzeigen und bei einer gewählten existierende Option die ID übergeben (Womit ich später ja die Kombination Ort & Strasse wieder finde), sieht aber blöd aus, weil nach der Auswahl dann die ID im Feld Ort steht.

      Wieso das, eine Auswahlliste und Felder zur Eingabe einer neuen Adresse, das sind doch zwei vollkommen unterschiedliche Formularelemente?

      Zum anderen, wenn eine Kombination nicht existiert, gibt der User ja ggf einen neuen Ortsnamen ein. D.h. ich müsste später prüfen, ob der mit $_POST erhaltene Wert jetzt ein Ortsname oder eine ID ist.

      Nein, das sind zwei unterschiedliche Parameter, die aus zwei unterschiedlichen Formularfeldern stammen.
      (Welcher Parameter übergeben wurde, bzw. wie der Fall zu behandeln ist, wenn für beide ein Wert übergeben wurde, *das* musst du natürlich überprüfen bzw. behandeln.)

      MfG ChrisB

      --
      Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
      1. Hallo Chris,

        Hi,

        Als Option eine Kombination aus ID / Ort / Strasse anzeigen und bei einer gewählten existierende Option die ID übergeben (Womit ich später ja die Kombination Ort & Strasse wieder finde), sieht aber blöd aus, weil nach der Auswahl dann die ID im Feld Ort steht.

        Wieso das, eine Auswahlliste und Felder zur Eingabe einer neuen Adresse, das sind doch zwei
        vollkommen unterschiedliche Formularelemente?

        Ausnahme DATALIST, ist INPUT, man kann also was eingeben, gleichzeitig lassen sich aber OPTION VALUE Werte festlegen. Tippt man also etwas ein werden 'Treffer' innerhalb der Options als DROP DOWN Liste angezeigt & man kann etwas auswählen oder man tippt etwas nicht vorhandenes, dann bleibt das getippte der INPUT.

        Zum anderen, wenn eine Kombination nicht existiert, gibt der User ja ggf einen neuen Ortsnamen ein. D.h. ich müsste später prüfen, ob der mit $_POST erhaltene Wert jetzt ein Ortsname oder eine ID ist.

        Nein, das sind zwei unterschiedliche Parameter, die aus zwei unterschiedlichen Formularfeldern stammen.
        (Welcher Parameter übergeben wurde, bzw. wie der Fall zu behandeln ist, wenn für beide ein Wert übergeben wurde, *das* musst du natürlich überprüfen bzw. behandeln.)

        MfG ChrisB

  4. Hallo,

    Ich kann zwar mit   <input type="text" name="feld[]"  ... /> ein array für die $_POST Übernahme erstellen, aber anscheinend nicht mehrdimensional.

    Zum Gruppieren der Eingaben, lege die Parameternamen entsprechend fest, dann geht noch mehr, z.B.:

    feld[addr][str]
    feld[addr][plz]
    feld[addr][ort]

    Aus diesen Strings, die auch noch tiefer gegliedert sein können, fummelt der serverseitige Parser dann ein Array zusammen, zu finden in $_POST oder $_GET, je nach festgelegter Methode.

    MfG

    1. Hallo,

      Ich kann zwar mit   <input type="text" name="feld[]"  ... /> ein array für die $_POST Übernahme erstellen, aber anscheinend nicht mehrdimensional.

      Zum Gruppieren der Eingaben, lege die Parameternamen entsprechend fest, dann geht noch mehr, z.B.:

      feld[addr][str]
      feld[addr][plz]
      feld[addr][ort]

      schon, aber wenn ich all die Antworten richtig verstanden habe, kann ich in EINEM INPUT Feld keine 2 array Elemente definieren.
      Ich kann zwar dem array Feld[] in einem einzelnen INPUT durch multiplen select mehrere Einträge verpassen aber eben nicht feld[addr][str] UND feld[addr][ort] gleichzeitig.
      Also:
      -feld[addr1][ort]
      -feld[addr2][ort]
      würde klappen mit multiplen select und max Auswahl 2, aber
      -feld[addr][ort]
      -feld[addr][str]
      ist in einem einzelnen INPUT nicht möglich. So hab ich die Antworten verstanden.

      Oder hab ich da was falsch verstanden?

      mfg

      1. Hallo,

        Ich kann zwar dem array Feld[] in einem einzelnen INPUT durch multiplen select mehrere Einträge verpassen aber eben nicht feld[addr][str] UND feld[addr][ort] gleichzeitig.

        Naja, mehrere input-Felder brauchst Du schon.

        <input name="feld[addr][plz]">
        <input name="feld[addr][ort]">
        <input name="feld[addr][str]">

        MfG

      2. Liebe Mitdenker,
        liebe Wissende,
        liebe Neugierige,

        ja!

        -feld[addr1][ort]
        -feld[addr2][ort]
        würde klappen mit multiplen select und max Auswahl 2, aber

        -feld[addr][ort]
        -feld[addr][str]
        ist in einem einzelnen INPUT nicht möglich. So hab ich die Antworten verstanden.

        Nein, aber mit einer Select-Multiple-Box oder mit Checkboxes, die den Werten zugeordnet sind.

        Statt der praktischen JavaScript-Lösung kannst Du auch Checkboxes benutzten.

        Da wir leider nicht wissen können, was Du eigentlich vor hast, können wir Dir nicht vernünftig helfen. Bitte beschreib doch mal die Aufgabenstellung etwas detaillierter.

        Außerdem kannst Du dir dein HTML (also die Eingabefelder) doch von PHP (datenabhängig) generieren lassen.

        Angenommen, Du hast drei Datensätze zur Auswahl:

        $_rec[1]['firstname'] = 'Peter';
        $_rec[1]['lastname']  = 'Pullermann';
        $_rec[1]['address']   = 'Seicherstraße 13';
        $_rec[1]['plz']       = NULL;
        $_rec[1]['city']      = 'Pinkelburg';

        $_rec[2]['firstname'] = 'Peter';
        $_rec[2]['lastname']  = 'Pullermann';
        $_rec[2]['address']   = NULL;
        $_rec[2]['plz']       = '01234']
        $_rec[2]['city']      = 'Pinkelburg';

        $_rec[3]['firstname'] = 'Peter-Paul';
        $_rec[3]['lastname']  = NULL;
        $_rec[3]['address']   = 'Seicherstraße';
        $_rec[3]['plz']       = '01234';
        $_rec[3]['city']      = 'Pinkelburg-Stinkhausen';

        Soweit ich das verstanden habe, willst Du die Daten nun verdichten:

        $_rec['result']['firstname'] = 'Peter-Paul';
        $_rec['result']['lastname']  = 'Pullermann';
        $_rec['result']['address']   = 'Seicherstraße 13';
        $_rec['result']['plz']       = '01234';
        $_rec['result']['city']      = 'Pinkelburg-Stinkhausen';

        Du müsstest die angezeigten Daten also anklickbar oder auswählbar machen:

        $_rec['select']['firstname'] = 3;
        $_rec['select']['lastname']  = 1;  ## oder 2
        $_rec['select']['address']   = 1;
        $_rec['select']['plz']       = 2;  ## oder 3
        $_rec['select']['city']      = 3;

        Das kannst Du dann auf dem Server auswerten.

        Du müsstest also z.B. über jedes Feld eine Radio-Group legen (senkrecht), sodass man immer nur eine Zeile von ['name'] auswählen kann

        Ergänzend kannst Du dann noch einen leeren Datensatz bereitstellen. Wenn in dessen Felder etwas  eingegeben wird, gilt dieses Feld.

        Wenn man JavaScript benutzt zur Auswahl. kann man den angebotenen Wert auch automatisch in den Zielwert übertragen lassen. Den kannst Du dann anschließend noch editieren, bovor Du postest. Die Vorschlagsfelder dürfen dazu auch gleichnamig sein, also alle Nachnamensfelder heißen ['lastname'], alle Ortsfelder heißen ['city'].

        Damit benötigst Du imho nur eine einzige JavaScript-Funktion, die nur genügend geschickt geschrieben sein muss. Die bindest Du dann bgei den Feldern für das onClick-Event ein, und das wars schon!

        Auf dem Server kommt dann nur das Ergebnis an.

        Spirituelle Grüße
        Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
  5. Liebe Mitdenker,
    liebe Wissende,
    liebe Neugierige,

    ja!

    mein Problem als Laie ist folgendes:
    Ich habe ein Eingabeformular ( DATALIST ), dessen Option values per php aus einer Tabelle gefüllt werden. Es kann also ein aus der Tabelle gefüllter Wert ausgewählt werden, oder ein eigener eingegeben werden. Funktioniert mit einem Wert auch.
    Ich möchte nun aber mit der Auswahl eines Tabellenwertes bewirken, dass 2 Felder aus dem Datensatz übernommen werden, z.bsp Ort und Strasse.

    Ich habe das jetzt nochmal gelesen und glaube nun, Dich zu 20-70% zu verstehen ;-)

    Da würde ich ggf. zu JavaScript tendieren.

    • Daten werden angezeigt in disableten Datenfeldern
    • Durch Einfachklick wird das Feld enabled
        Nun kann man den Wert auch editieren

    Beim Submit werden dann nur die aktiven Felder übertragen.

    Das sollte für den Bediener intuitiv genug sein und auch schnell genug

    Spirituelle Grüße
    Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!
    1. Hallo Robert,

      danke für den Tipp, aber bevor ich jetzt noch mit js anfange, versuch ich erst mal php intus zu bekommen.

      gruss Franz

      Da würde ich ggf. zu JavaScript tendieren.

      • Daten werden angezeigt in disableten Datenfeldern
      • Durch Einfachklick wird das Feld enabled
          Nun kann man den Wert auch editieren

      Beim Submit werden dann nur die aktiven Felder übertragen.

      Das sollte für den Bediener intuitiv genug sein und auch schnell genug

      Spirituelle Grüße
      Euer Robert