Marcel: Checkboxen

Hi!

Ich hab mal eine kleine Verständnis Frage zum Kapitel der Checkboxen in der SelfHTML.

Wenn sich ein Neuling strickt an das hält, was die SelfHTML dazu schreibt, funktioniert es so nicht, wie beschrieben.
Was will ich sagen?

Wenn man mehrere Checkboxen nutzt, die alle das selbe name Attribut haben, wird stets die letzte Auswahl abgeschickt.

Meiner Meinung nach sollte dies in der SelfHTML erwähnt werden. Oder hab ich es einfach nur überlesen?

Gruß Marcel

  1. Ave Marcel!

    Wenn man mehrere Checkboxen nutzt, die alle das selbe name Attribut haben, wird stets die letzte Auswahl abgeschickt.

    Du sollst ja auch nicht mit den name Attributen den abzuschickenden Wert bestimmen sondern mit value.

    Meiner Meinung nach sollte dies in der SelfHTML erwähnt werden. Oder hab ich es einfach nur überlesen?

    "Beachten Sie:

    Im Gegensatz zu Radiobuttons müssen Checkboxen keine identische Namen haben, um zu funktionieren. Es ist aber hinsichtlich des auswertenden Skripts eventuell sehr sinnvoll, identische Namen zu verwenden, weil das Skript dann automatisch ein Array anlegt.

    Für PHP-Nutzer der Hinweis: Das automatische Anlegen eines Arrays funktioniert nur, wenn der Name des Feldes mit eckigen Klammern endet: name="zutaten[]". Beachten Sie wegen dieses Namens auch die Hinweise für den nach oben Zugriff mit JavaScript (Beispiel 4)."

    Wenn du nicht verratest, wie du die Daten verarbeitest kann dir hier auch niemand verraten, was du wo falsch machst.

    Grüße aus H im R an Marcel,
      Primus Enginus*

    --
    Und wenn´s dir nicht gefällt, http://dann.nimmet.net/mir-doch-egal!
    Der Valligator
    "Computer sagt Nein"
    1. Hallo,

      Wenn man mehrere Checkboxen nutzt, die alle das selbe name Attribut haben, wird stets die letzte Auswahl abgeschickt.

      nein, sie werden alle verschickt (jedenfalls alle, die markiert sind).
      Wenn sie aber durch ein PHP-Script über $_GET[] oder $_POST[] ausgewertet werden, ist tatsächlich nur noch der letzte Eintrag verfügbar. Warum? Weil die vorhergehenden überschrieben werden.

      Beispiel: Gegeben seien drei aktivierte Checkboxen.

      <input type="checkbox" name="auswahl" value="eins">
        <input type="checkbox" name="auswahl" value="zwei">
        <input type="checkbox" name="auswahl" value="drei">

      Beim Absenden des zugehörigen Formulars entsteht folgende Reihe von URL-Parametern:

      ?auswahl=eins&auswahl=zwei&auswahl=drei

      Beim Befüllen des $_GET-Arrays geht PHP so vor, als stünden da einzelne Zuweisungen am Scriptanfang:

      $_GET['auswahl'] = 'eins';
         $_GET['auswahl'] = 'zwei';
         $_GET['auswahl'] = 'drei';

      Es ist offensichtlich, dass die ersten beiden Werte dabei verlorengehen. Allerdings kann ein Script durchaus auf den ungeparsten Original-Query zugreifen, der mit $_SERVER['QUERY_STRING'] zur Verfügung steht. Dann muss man die Parameter einzeln aufdröseln - das ist meistens unnötig, aber möglich.

      Deswegen wird ja auch empfohlen, das name-Attribut mit einer eckigen Klammer als Bestandteil des Namens zu notieren. Dann sieht die PHP-interne Initialisierung nämlich so aus:

      $_GET['auswahl'][] = 'eins';
         $_GET['auswahl'][] = 'zwei';
         $_GET['auswahl'][] = 'drei';

      Hier wird in $_GET['auswahl'] also wiederum ein Array angelegt, das die Werte 'eins', 'zwei' und 'drei' enthält.

      Du sollst ja auch nicht mit den name Attributen den abzuschickenden Wert bestimmen sondern mit value.

      Schon richtig, der Hinweis passt aber nicht zum Problem. ;-)

      Schönen Sonntag noch,
       Martin

      --
      Die letzten Worte des Architekten:
      Mir fällt da gerade was ein...
      1. Ave Martin!

        Deswegen wird ja auch empfohlen, das name-Attribut mit einer eckigen Klammer als Bestandteil des Namens zu notieren. Dann sieht die PHP-interne Initialisierung nämlich so aus:
           $_GET['auswahl'][] = 'eins';
           $_GET['auswahl'][] = 'zwei';
           $_GET['auswahl'][] = 'drei';
        Hier wird in $_GET['auswahl'] also wiederum ein Array angelegt, das die Werte 'eins', 'zwei' und 'drei' enthält.

        Hiermit dürfte das Problem ausführlich aus der Welt geschafft sein.
        Danke für die Korrektur.

        Du sollst ja auch nicht mit den name Attributen den abzuschickenden Wert bestimmen sondern mit value.
        Schon richtig, der Hinweis passt aber nicht zum Problem. ;-)

        Naja, du hast wohl den Sinn meiner 'meistens' geratenen antworten nicht verstanden.
        Ich denk mir eine "Logische" Lösung aus, die logischer weise meistens falsch ist, damit ist dann garantiert, das wenn ein Experte mich berichtigt[1] und gleichzeitig die lösung erklärt gleich 2-3 weitere Punkte geklärt sind.[2] ;-)

        Grüße aus H im R an Der,
          Primus Enginus*
        [1] so wie jetzt du
        [2] auf diese weise hab ich nicht wenig gelernt :)

        --
        Und wenn´s dir nicht gefällt, http://dann.nimmet.net/mir-doch-egal!
        Der Valligator
        "Computer sagt Nein"
        1. Hallo Engin,

          Schon richtig, der Hinweis passt aber nicht zum Problem. ;-)
          Naja, du hast wohl den Sinn meiner 'meistens' geratenen antworten nicht verstanden.

          nein, zumindest nicht so, wie du ihn beschreibst. Raffiniertes Prinzip! :-)

          Ich denk mir eine "Logische" Lösung aus, die logischer weise meistens falsch ist

          So ist das halt mit der Logik. Jeder sieht sie etwas anders.
          Und auch in der Digitaltechnik geschehen Dinge zwischen 0 und 1, die sind alles, nur nicht logisch.

          damit ist dann garantiert, das wenn ein Experte mich berichtigt[1:so wie jetzt du]

          *hust* Sag das nicht so laut, sonst glaub ich's noch!

          und gleichzeitig die lösung erklärt gleich 2-3 weitere Punkte geklärt sind.[2:auf diese weise hab ich nicht wenig gelernt] ;-)

          Das ist nicht die schlechteste Art zu lernen!

          Grüße aus H im R an Der,

          ;-)

          Grüße zurück in die alte Heimat,
           Martin

          --
          Mir geht es gut. Ich mag die kleinen Pillen, die sie mir dauernd geben.
          Aber warum bin ich ans Bett gefesselt?
      2. Hallo,

        Wenn sie aber durch ein PHP-Script über $_GET[] oder $_POST[] ausgewertet werden, ist tatsächlich nur noch der letzte Eintrag verfügbar. Warum? Weil die vorhergehenden überschrieben werden.

        Das ist der Fall: Es wird über ein PHP Skript verarbeitet. Ist ein Formmailer eines hier verlinkten Services.

        Beispiel: Gegeben seien drei aktivierte Checkboxen.

        <input type="checkbox" name="auswahl" value="eins">
          <input type="checkbox" name="auswahl" value="zwei">
          <input type="checkbox" name="auswahl" value="drei">

        Beim Absenden des zugehörigen Formulars entsteht folgende Reihe von URL-Parametern:

        ?auswahl=eins&auswahl=zwei&auswahl=drei

        Beim Befüllen des $_GET-Arrays geht PHP so vor, als stünden da einzelne Zuweisungen am Scriptanfang:

        $_GET['auswahl'] = 'eins';
           $_GET['auswahl'] = 'zwei';
           $_GET['auswahl'] = 'drei';

        Es ist offensichtlich, dass die ersten beiden Werte dabei verlorengehen.

        Das ist anscheinend das Problem...

        Allerdings kann ein Script durchaus auf den ungeparsten Original-Query zugreifen, der mit $_SERVER['QUERY_STRING'] zur Verfügung steht. Dann muss man die Parameter einzeln aufdröseln - das ist meistens unnötig, aber möglich.

        Deswegen wird ja auch empfohlen, das name-Attribut mit einer eckigen Klammer als Bestandteil des Namens zu notieren. Dann sieht die PHP-interne Initialisierung nämlich so aus:

        $_GET['auswahl'][] = 'eins';
           $_GET['auswahl'][] = 'zwei';
           $_GET['auswahl'][] = 'drei';

        Hier wird in $_GET['auswahl'] also wiederum ein Array angelegt, das die Werte 'eins', 'zwei' und 'drei' enthält.

        In "reinem" HTML dann so:

        <input type="checkbox"  name="irgendwas[1]" value="eins">
        <input type="checkbox"  name="irgendwas[2]" value="zwei">
        <input type="checkbox"  name="irgendwas[3]" value="drei">

        ???

        Marcel

        1. Hi,

          In "reinem" HTML dann so:

          <input type="checkbox"  name="irgendwas[1]" value="eins">
          <input type="checkbox"  name="irgendwas[2]" value="zwei">
          <input type="checkbox"  name="irgendwas[3]" value="drei">

          so würde es wohl auch funktionieren - aber warum den Index auch noch vorgeben? Das provoziert nur Fehler. Zum Beispiel: Warum beginnst du die Zählung mit 1 und nicht mit 0?
          Ich schrieb ganz bewusst:

          Deswegen wird ja auch empfohlen, das name-Attribut mit einer eckigen Klammer als Bestandteil des Namens zu notieren.

          Ich habe nicht gesagt, dass du auch etwas in die Indexklammern hineinschreiben sollst. :-)

          Ciao,
           Martin

          --
          Okay, Alkohol ist keine Antwort.
          Aber manchmal vergisst man beim Trinken wenigstens die Frage.
    2. Hi Engin!

      Besten Dank für deine Info.

      Du sollst ja auch nicht mit den name Attributen den abzuschickenden Wert bestimmen sondern mit value.

      Dass ich den Wert mit value angebe, war sogar für mich klar ;-) Nur die Bezeichnung des Feldes wird (soweit ich informiert bin) mit name gemacht. (Für Verbesserungen stets offen)

      Wenn du nicht verratest, wie du die Daten verarbeitest kann dir hier auch niemand verraten, was du wo falsch machst.

      Es soll ein einfaches HTML Formular sein, dass mittels eines Formmailers eines auf der SelfHTML verlinkten Services (mache jetzt keine Werbung) verarbeitet wird.

      Marcel