Steffka: Radio-Buttons -> dynamische Namensvergebung

Hallo zusammen.

Ich bin gerade ziemlich ratlos.

Bin dabei eine Tabelle zu erzeugen, die ein Formular beinhaltet, bei dem mit zwei Radio-Buttons angegeben werden kann, ob man an dem gewünschten Termin teilnehmen kann oder nicht. Die gesamten Inhalte lese ich aus einer MySql-Datenbank. Die eingestellten Werte der radio-buttons sollen an das Skript versendet werden und in div. Funktionen wieder in die Datenbank geschrieben werden.

Da ich pro Tag zwei Radio-buttons habe und die ganzen Infos für einen gewissen Zeitraum mit einem Send-button abschicke, müssen die Buttons natürlich vom Namen her differenzieren. Das habe ich so etwa gelöst:

$verfuegbarkeit = "name" . $i . "[]";
<input type="radio" name=',$verfuegbarkeit,' value="1">

Alle anderen Infos werden über hidden-felder weitergereicht.
Wenn das Formular abgesendet ist, möchte ich die übergebenen variablen erstmal in einer Forschleife ausgeben.
Bei den normalen Arrays funktioniert dies mit:
echo "$HTTP_POST_VARS["xyz"][$i];

Aber leider nicht bei "$verfuegbarkeit".
Ich finde leider keine Infos im Netz dazu und bin mitlerweile auch sehr am zweifeln, ob das überhaupt in PHP geht. So weit gehen meine Kenntnisse da leider auch nicht.

Wär super, wenn Ihr mir da weiterhelfen könntet.

Vielen Herzlichen Dank im Voraus,
Steffka

  1. Hello,

    Museum!

    $HTTP_POST_VARS ist nicht mehr Stand der Dinge und verschwindet bei PHP Fünfeinhalb per Default.
    Forschleifen für die Abarbeitung übertragener Parameter sind unpraktisch und sollten durch passende Namenswahl und foreach()-Schleifen erstetzt werden.

    Und sonst versteh ich nur Bahnhof. Aber das mag daran liegen, ass ich gerade dabei bin, im alten Bahnhof der Sankt Andreasberger Zahnradbahn die "Oberharz Akademie" aufzubauen.

    Sag doch nochmal, was in der DB steht.
    Wie heißen die Spalten, welche Typen haben sie und welche Defaults?

    Wie soll ein exemplarisches Formular aufgebaut sein?

    Wie ist die Datendynamic? Also welche Änderunge  treten täglich auf?

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. ok. Sorry. Bin mitlerweile etwas matsche im kopf!

      Also ich hab eine SQL-Tabelle mit den Spalten: Datum, Name, Verfuegbarkeit

      Die Spalten lasse ich mir zum Beispiel für eine Woche anzeigen. Das feld verfügbarkeit beinhaltet entweder 1 oder 0. Das zeige ich in Form von zwei Radiobuttons / Tag an. Der button ist aktiv, wenn das feld eine 1 beinhaltet.
      Der benutzer kann nun seine verfügbarkeit eintragen und abschicken.

      Das problem ist ja nun, dass ich ca. 14 radio-buttons habe, die aber nicht leich heißen dürfen. Sie dürfen nur für einen Tag den gleichen namen haben. Daher muss ich das leider, nach bisherigem Kenntnisstand mit einer hochzählenden variablen ($i) machen, die an den feldnamen angehangen wird, damit jeder tag einen anderen Namen hat.
      Das funktioniert auch soweit bisher.

      Was nur noch funktioniert, ist, wenn ich die Daten absende und auswerten, d.h. zurückschreiben möchte, da komme ich entweder mit der Syntax oder was anderem nicht klar, wie ich mit POST $verfuegbar , welches ja aus Name1....8[] besteht, auslesen kann.
      Das Auslesen des Datums und des Namens funktioniert problemlos ür die Zuordnung.

      Hoffe, ich hab das jetzt ein wenig verständlicher hinbekommen... :-)

      Vielen Dank,
      Steffka

  2. hallo,

    Aber leider nicht bei "$verfuegbarkeit".
    Ich finde leider keine Infos im Netz dazu und bin mitlerweile auch sehr am zweifeln, ob das überhaupt in PHP geht. So weit gehen meine Kenntnisse da leider auch nicht.

    ich versteh nicht warum du das mit ner schleife lösen willst,
    du hast pro tag zwei radio button, also einen namen pro tag zum auswerten.

    in deinem script kannst du dein button mit $_POST["deinname"] erreichen,

    oder versteh nicht genau wie dein formular aufgebaut ist.

  3. Ahoi Steffka,

    $verfuegbarkeit = "name" . $i . "[]";
    <input type="radio" name=',$verfuegbarkeit,' value="1">

    warum machst du es nicht so:

    <input type="radio" name="verfuegbar[]" value="'.$tag_id.'">
    <input type="radio" name="nichtverfuegbar[]" value="'.$tag_id.'">

    dann in der auswertung ein

    foreach($_POST['verfuegbar'] as $tag_id)
    {
      eintrag in DB das verfügbar
    }

    foreach($_POST['nichtverfuegbar'] as $tag_id)
    {
      eintrag in DB das nicht verfügbar
    }

    MfG

    1. Moin!

      $verfuegbarkeit = "name" . $i . "[]";
      <input type="radio" name=',$verfuegbarkeit,' value="1">

      warum machst du es nicht so:

      <input type="radio" name="verfuegbar[]" value="'.$tag_id.'">
      <input type="radio" name="nichtverfuegbar[]" value="'.$tag_id.'">

      Radiobuttons, die in einer "Schaltgruppe" sein sollen, benötigen identische Namen. Das ist bei "verfügbar/nichtverfügbar" aber nicht der Fall.

      dann in der auswertung ein

      foreach($_POST['verfuegbar'] as $tag_id)
      {
        eintrag in DB das verfügbar
      }

      foreach($_POST['nichtverfuegbar'] as $tag_id)
      {
        eintrag in DB das nicht verfügbar
      }

      Vernünftige Lösungen würden das in einer einzigen Schleife erledigen können.

      - Sven Rautenberg

    2. Ahoi Steffka,

      $verfuegbarkeit = "name" . $i . "[]";
      <input type="radio" name=',$verfuegbarkeit,' value="1">

      warum machst du es nicht so:

      <input type="radio" name="verfuegbar[]" value="'.$tag_id.'">
      <input type="radio" name="nichtverfuegbar[]" value="'.$tag_id.'">

      das wäre doch falsch, die namen einer gruppe von radio's muss identisch sein!

      sonst könnte man mehrere werte für die gruppe auswählen, und das sollte ja nicht sein.

    3. Aber im value habe ich ja 1 oder 0 stehen.
      Das benötige um zu sehen, welches Feld gerade checked ist.
      Da kann ich leider keine anderen Werte nehmen, denke ich...

      1. Ahoi Steffka,

        Da kann ich leider keine anderen Werte nehmen, denke ich...

        das problem ist der name. hab das ganz vergessen mitn radios. jetzt weis ich auch warum ich das so habe wie ich es habe.

        nicht angeglickte radios, checkboxen oder options (aus selects) werden nicht übergeben.

        bau dir den namen aus der tag-id auf. also
        echo '<input type="radio" name="ver_'.tag_id.'" value="0">';
        echo '<input type="radio" name="ver_'.tag_id.'" value="1">';

        es empfiehlt sich, da nicht angewählte radios auch nicht übergeben
        werden standardmäßig eines zu aktivieren.

        MfG

        1. Ahoi Daniel,

          Ah die hitze ist unerträglich.

          echo '<input type="radio" name="ver_'.tag_id.'" value="0">';
          echo '<input type="radio" name="ver_'.tag_id.'" value="1">';

          muss natürlich
          echo '<input type="radio" name="ver_'.$tag_id.'" value="0">';
          echo '<input type="radio" name="ver_'.$tag_id.'" value="1">';

          heißen, wenn du nun mit $_GET oder $_POST darauf zugreifen willst durchsuchst du nach

          $_POST['ver_'.$tag_id]
          das darin enthaltene value ist entweder 0 oder 1, je nachdem welches gewählt war.

          MfG

          1. Habs gerade so ausprobiert, nur mein Array noch drangehangen und es funktioniert leider nicht.

            Es sah dann so aus: ... name="verfueg'.$i.'[]"...
             Und das Auswerten: $_POST['verfueg'.$i][$a]

            $a wird in einer for-Schelife durch count($_POST['Datum']) ermittelt und bis Ende dann hochgezählt.

            1. Hab das jetzt auch mit der tag_id verstanden. *grins* Brett vorm kopf.

              Hab das aber bisher übergangsweise ertsmal mit ner inkrementellen variablen gemacht. Werde ich dann später anpassen.

            2. Ahoi Steffka,

              Habs gerade so ausprobiert, nur mein Array noch drangehangen und es funktioniert leider nicht.
              $a wird in einer for-Schelife durch count($_POST['Datum']) ermittelt und bis Ende dann hochgezählt.

              wie wäre es wenn du mal folgendes machst in deinem auswertungsskript:

                
              echo "<pre>";  
              print_r($_POST);  
              echo "</pre>";  
              
              

              MfG

              1. Huhu,

                herzlichen Dank für den Tip mit den Anzeigen der $_Post Variablen...

                Das problem ist gelöst, dank einem anderen beitrag.
                Aber trotzdem vielen herzlichen Dank für die Unterstützung!! :-)

                viele grüße,
                Steffka

        2. bau dir den namen aus der tag-id auf. also
          echo '<input type="radio" name="ver_'.tag_id.'" value="0">';
          echo '<input type="radio" name="ver_'.tag_id.'" value="1">';

          es empfiehlt sich, da nicht angewählte radios auch nicht übergeben
          werden standardmäßig eines zu aktivieren.

          Standardmäßig haben die radios immer den Wert 0, also und somit wäre das dann aktiviert.

          Ich verstehe nur das mit der tag-id nicht, obwohl es schon sehr nach einer einfachen Lösung aussehen könnte, wie ich mir das vorgestellt hab. Woher soll ich den Wert erhalten, aus meinem Datum? *grübel*

          1. Ahoi Steffka,

            Ich verstehe nur das mit der tag-id nicht, obwohl es schon sehr nach einer einfachen Lösung aussehen könnte, wie ich mir das vorgestellt hab. Woher soll ich den Wert erhalten, aus meinem Datum? *grübel*

            du halst doch die Tage aus der DB, bzw. termine und dazu machst du dann
            jeweils einen (nicht)verfügbar radio. oder hab ich da was falsch
            verstanden? wäre nicht schlecht wenn du etwas mehr code posten würdest,
            evt. auch etwas mehr zur DB struktur (tabellen, spalten, bsp.-werte)

            MfG

      2. Hello,

        Aber im value habe ich ja 1 oder 0 stehen.
        Das benötige um zu sehen, welches Feld gerade checked ist.
        Da kann ich leider keine anderen Werte nehmen, denke ich...

        Bei Radio-Buttons solltest Du Dir in der Session merken, welche Du zur Beantwortung versandt hast, und welche davon zurück kamen. Nicht ausgewählte Buttons werden auch nicht übertragen.

        Außerdem sollte man zur Sicherheit zu einer Art "Tri-State-Logik" greifen. Also nicht nur nach geklickt oder nicht fragen, sondern nach "JA geklickt" oder "Nein geklickt" oder vielleicht sogar "entklickt" durch die dritte Möglichkeit. Nicht zurückgesandt wäre dann gleichzusetzen mit "entklickt"

        Harzliche Grüße vom Berg
        esst mehr http://www.harte-harzer.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Ahoi Tom,

          Außerdem sollte man zur Sicherheit zu einer Art "Tri-State-Logik" greifen. Also nicht nur nach geklickt oder nicht fragen, sondern nach "JA geklickt" oder "Nein geklickt" oder vielleicht sogar "entklickt" durch die dritte Möglichkeit. Nicht zurückgesandt wäre dann gleichzusetzen mit "entklickt"

          also wie du einen radio-Button entklickst würd ich gerne sehen, ich hab
          das bis jetzt nur bei checkboxen geschaft.

          MfG

        2. Moin!

          Bei Radio-Buttons solltest Du Dir in der Session merken, welche Du zur Beantwortung versandt hast, und welche davon zurück kamen. Nicht ausgewählte Buttons werden auch nicht übertragen.

          Das gilt für Checkboxen, nicht unbedingt für Radiobuttons. Bei denen soll der User-Agent einen als gewählt markieren, sofern keiner vom HTML-Code vorausgewählt ist.

          Außerdem sollte man zur Sicherheit zu einer Art "Tri-State-Logik" greifen. Also nicht nur nach geklickt oder nicht fragen, sondern nach "JA geklickt" oder "Nein geklickt" oder vielleicht sogar "entklickt" durch die dritte Möglichkeit. Nicht zurückgesandt wäre dann gleichzusetzen mit "entklickt"

          Von den Radiobuttons einer Gruppe ist exakt einer gewählt, und man hat auch keine Chance, eine einmal gewählte Gruppe wieder komplett "ungewählt" zu machen.

          - Sven Rautenberg

          1. Hello,

            Von den Radiobuttons einer Gruppe ist exakt einer gewählt, und man hat auch keine Chance, eine einmal gewählte Gruppe wieder komplett "ungewählt" zu machen.

            Zweiter Teil des Satzes: Sag ich doch! Aber manchmal mag sich der User weder für Schwarz noch für Weiß entscheiden, und ärgert sich dann

            Erster Teil des Satzes: wenn er aus einer Gruppe von Radios, bei der keiner als checked="checked"  übertragen wurde, sich versehentlich für eine entschieden hat. Ich kenne keinen Browser, der aus einer Gruppe ohne "checked" selber einen auswählt.

            Harzliche Grüße vom Berg
            esst mehr http://www.harte-harzer.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
  4. Moin!

    $verfuegbarkeit = "name" . $i . "[]";
    <input type="radio" name=',$verfuegbarkeit,' value="1">

    Das erzeugt dir Namen im Stile von
    name1[]
    name2[]
    name3[]...

    Bei den normalen Arrays funktioniert dies mit:
    echo "$HTTP_POST_VARS["xyz"][$i];

    Aber leider nicht bei "$verfuegbarkeit".

    Weil das kein Array ist, sondern du dir ganz viele Arrays (jeweils mit "name"+Zahl benannt) erzeugt hast, aber kein einheitliches.

    Zuerst: Der Trick mit dem "[]", um ein Array zu erzeugen, funktioniert komplett: Wenn du in die Klammern einen Index, z.B. eine Zahl, reinschreibst, dann legt PHP dir statt "der nächste erreichbare Index des Arrays" ein Element mit dem angegebenen Index an.

    name="name[23]" ist also ein erlaubter Name im Hinblick auf PHP, das würde zu $_POST['name'][23] führen - in Schleifen abfragbar mit foreach($_POST['name'] as $key => $value) - in $key stünde dann die 23 drin, in $value der Input-Value.

    Und da HTML sich nicht um irgendwelche Sonderzeichen kümmern, kannst du anstelle eines billigen <input type=text name="name[23]" auch zwei Radiobuttons mit diesem Namen ausstatten, und im Value jeweils "ja" und "nein" oder sonstige passende Werte einfügen.

    Schlau ist es dann allerdings, in deiner Datenbank noch eine Spalte "ID" anzulegen, und diese ID als Arrayindex ins HTML zu schreiben, anstelle einfach nur durchzunumerieren. Denn wenn du nur durchnumerierst, dann hängt die korrekte Zuordnung davon ab, dass sich diese Ordnung nicht ändert. Das kann aber nicht garantiert werden, denn Datensätze können ja durchaus zwischendurch neu dazukommen. Mit der ID kannst du jeden Radiobutton immer zum zugehörigen Datensatz zuordnen.

    - Sven Rautenberg

    1. Also meinst du, ich könnte name="name[$i]" schreiben und $i immer die gewünschte ID anzugeben? Und dann in einer foreach-schleife ausgeben...

      Hört sich auch super an. Probier ich direkt auch mal aus.

    2. herzlichen Dank!!!!!!

      Das war es!!! Es funktioniert!

      Vielen vielen Dank nochmal!