David: unbestimmte Anzahl an Checkboxen auswerten

Hallo Leute,

Hintergrundinfo:
Es soll eine NICHT festgelegte Anzahl an Checkboxen dargestellt werden, von denen einige einen Haken haben, abdere aber auch nicht.

Der Nutzer kann nun diverse Optionen aktivieren bzw. deaktivieren und anschließend seinen wunsche per Submit-Button absenden.

Problem:
Dadurch, dass die Checkboxen keine Feste anzahl haben, also immer variieren, kann ich den Checkboxen keinen Festen Namen geben.
Wie kann ich dann also die Abfrage der einzelnen Checkboxen gestallten.
Bisher habe ich es folgender maßen:

//solange nicht alle Optionen aufgeführt sind, wird "X" einen hochgezählt

for ($x = "0"; $x <= $optionen; $x++)
    {
    <input type="checkbox" name="box$x" value="ja">Option $x;
    }

Im Verarbeitungsscript muss ich allerdings dann den Umstand betreiben, jede möglich box einzeln anzusprechen:

if ($box0=="ja")
   {
   // Option aktivieren
   }
else
   {
   // Option deaktivieren
   }

if ($box1=="ja")
   {
   // Option aktivieren
   }
else
   {
   // Option deaktivieren
   }
u.s.w.

Das ist mit großer Wahrscheinlichkeit keine Glanzlösung, somal die Anzahl der Checkboxen bis zu 20-30 werden könnte.

Hat da jemand eine Idee, wie man das etwas hübscher gestallten kann?

Ich Danke Euch

  1. Hallo David,

    Es soll eine NICHT festgelegte Anzahl an Checkboxen dargestellt werden, f.f.

    okay,
    diese Demoseite hat immer eine feste Anzahl von Checkboxen, aber das stoert
    eigentlich nicht, weil man mit dieser Methode immer so viele Variable erhaelt,
    wie Checkboxen aktuell vorhanden sind.

    Wenn Dir das zu kompliziert ist, melde Dich einfach noch einmal ...

    Gruss Norbert

    1. Leider funzt der Link nicht... :(

      diese Demoseite hat
      Gruss Norbert

      1. Leider funzt der Link nicht... :(

        diese Demoseite hat

        komisch, bei mir klappt das problemlos.
        Versuche es noch einmal, vielleicht stottert irgendwo eine Bridge/Gateway o.ae. ...
        Und wenn Du mich anmails poste ich Dir gerne auch das Script.

        Gruss Norbert

        1. Hello,

          diese Demoseite hat
          komisch, bei mir klappt das problemlos.

          Wie wäre es so? http://uris.de/test/matrix.php

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    2. Wenn Dir das zu kompliziert ist, melde Dich einfach noch einmal ...

      ne ne, das hab ich schon verstanden.

      So schön finde ich die Lösung aber auch nicht.
      Man kann die vielen, vielen Checkboxen doch ebensogut mit der For-Schleife realisieren, um halt diesen riesigen Qellcode etwas zu straffen.
      Aber inzwischen habe ich es hinbekommen.
      Ich habe einfach aus einer einfachen Variable, die vorher der Name der Chebox war ein Array gemacht. der Rest war dann einfach, einfach nur das übergebene Array mit ner erneuten For-Schleife auswerten.

      Aber trotzdem Danke für Deine Mühe...

      1. Hello,

        Ich habe einfach aus einer einfachen Variable, die vorher der Name der Chebox war ein Array gemacht. der Rest war dann einfach, einfach nur das übergebene Array mit ner erneuten For-Schleife auswerten.

        Wenn es um die Post-Daten geht, solltest Du das übergebene Array nicht mit for() sondern besser mit foreach() auswerten. Dann sind die Indices erstmal egal.

        Anderenfalls müsstet Du ja vor jedem

        $_POST['check'][$i]

        fragen, ob die Variable auch gestzt ist.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      2. Wenn Dir das zu kompliziert ist, melde Dich einfach noch einmal ...
        ne ne, das hab ich schon verstanden.

        okay,
        da werfe ich ein Schippchen Sand in Dein Getriebe:
        Wie erfasst Du Aenderungen wenn eine Checkbox aktiviert ist
        und der User das aber zurueck aendern moechte/will/muss.

        Aber trotzdem Danke für Deine Mühe...

        keine Ursache,
        das Script liegt da schon mehrere Jahre zur Ansicht.

        Gruss Norbert

  2. Moin!

    Dadurch, dass die Checkboxen keine Feste anzahl haben, also immer variieren, kann ich den Checkboxen keinen Festen Namen geben.

    Doch. Und das tust du ja auch:

    for ($x = "0"; $x <= $optionen; $x++)
        {
        <input type="checkbox" name="box$x" value="ja">Option $x;
        }

    Im Verarbeitungsscript muss ich allerdings dann den Umstand betreiben, jede möglich box einzeln anzusprechen:

    Du benutzt "register_globals=on", das ist absolut nicht ratsam und wird in künftigen PHP-Versionen nicht mehr möglich sein. Stell deinen Programmierstil um!

    Du erhälst von PHP je nach Formularmethode entweder $_GET oder $_POST als Array zur Verfügung gestellt, in dem alle Formularnamen als Index enthalten sind. Die Namen sind Strings, die du wieder, genauso wie beim Generieren des Formulars, zusammensetzen kannst aus Namensteil und Ziffer.

    Und schon hast du kein Problem mehr, sondern kannst eine Schleife verwenden.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi Sven Rautenberg,

      Eine Frage hätte ich da noch:
      Was meinst Du genau mit "register_globals=on".

      Kannst mir da noch mehr drüber erzählen, was PHP wann nicht mehr mitmacht?

      1. Moin!

        Eine Frage hätte ich da noch:
        Was meinst Du genau mit "register_globals=on".

        Kannst mir da noch mehr drüber erzählen, was PHP wann nicht mehr mitmacht?

        register_globals ist eine Option sehr zweifelhafter Qualität, die automatisch dafür sorgt, dass alle Parameter in der URL und in POST-Requests automatisch zu globalen Variablen gewandelt werden.

        Dieser Mechanismus erlaubt es bösen Angreifern, in anfälligen Skripten beliebige globale Variablen zu erzeugen und mit schädlichem Inhalt vorzubelegen. Wenn ein Skript seine Variablen nicht vor dem Gebrauch mit festen Werten initialisiert, baut man sich damit in der Regel böse Sicherheitslücken.

        Ab PHP Version 6 gibt es register_globals nicht mehr, und schon seit PHP Version 4.2 ist es standardmäßig abgeschaltet - wird aber leider von zu vielen Providern immer noch wieder aktiviert, weil sich sonst zuviele Kunden beschweren würden, dass ihre Skripte nicht laufen - anstelle dass die Skripte stattdessen aktualisiert werden.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Also im Klartext geht es letztlich nur darum, dass ich zu Begin des Scrptes meine Variablen definiere?
          Beispiel:

          $strasse = $_POST["strasse"];
           $hsnr = $_POST["hsnr"];
           $ort = $_POST["ort"];
           $plz = $_POST["plz"];

          usw.

          ???

          PS: Kommst Du auch aus dem Norden, besser Gesagt SH? [Moin ;)]

          1. Moin!

            Also im Klartext geht es letztlich nur darum, dass ich zu Begin des Scrptes meine Variablen definiere?
            Beispiel:

            $strasse = $_POST["strasse"];
            $hsnr = $_POST["hsnr"];
            $ort = $_POST["ort"];
            $plz = $_POST["plz"];

            Schlechtes Beispiel. Warum kopierst du die Variablen? Das bringt dir nichts - im Gegenteil ist es eher schädlich, weil du einer Variablen $_POST sofort ansiehst: "Achtung, benutzerdefinierter Inhalt, kann schädlich sein", während du das einer umkopierten Variablen an ihrem Namen nicht mehr sofort ansiehst.

            Nutze $_POST, $_GET etc. immer direkt. Den Variablennamen tippst du nur einmal - bei der Fehlersuche liest du ihn aber hundertmal, es ist also gut angelegter Aufwand, etwas mehr zu tippen - vom sinnlosen RAM-Verbrauch mal ganz abgesehen.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
          2. echo $begrüßung;

            Also im Klartext geht es letztlich nur darum, dass ich zu Begin des Scrptes meine Variablen definiere?

            Nicht indem du die $_POST- oder $_GET-Inhalte kopierst, aber das hat dir Sven schon erklärt. Es geht darum, vor dem ersten lesenden Zugriff mindestens einen Schreibzugriff durchzuführen. Das muss nicht zwingend am Anfang eines Scriptes erfolgen, jedoch vor dem ersten Gebrauch. Zum Beispiel:

            foreach ($irgendwas as $item)
                $string .= $item;

            $string soll beim ersten Durchlauf angelegt werden. Aber wenn es bereits vorher existierte, z.B. aufgrund von register_globals, und schon einen Wert beinhaltet, hängt der erster (und alle weiteren) Schleifendurchlauf ihr Zeug an irgendwas Eingeschlepptes. So wird $string definiert mit einem Leerstring angelegt, und das was irgendwer vorher reingeschrieben hat verworfen:

            $string = '';
              foreach ($irgendwas as $item)
                $string .= $item;

            Stelle beim Entwickeln immer das error_reporting auf E_ALL (und display_errors auf on), damit du solche Lesezugriffe auf nicht vorhandene Variablen mit einer Hinweismeldung angezeigt bekommst.

            if (bedingung)
                $variable = 'bla';

            // etwas später
              echo $variable;

            Wenn bedingung nicht wahr wird, existiert $variable nicht. Das echo greift also ins Leere, oder in das was dir irgendjemand durch Vorbelegung von $variable eingeschleppt hat, z.B. wenn bei register_globals=on jemand

            http://example.org/dein_script.php?variable=blödsinn

            aufruft.

            [1]  $variable = '';
                 if (bedingung)
                   $variable = 'bla';
            [2]  else
            [2]    $variable = '';

            Entweder [1] oder [2] ist notwendig, um $variable definiert anzulegen.

            Wichtig ist auch, Ausgaben kontextgerecht zu behandeln

            echo htmlspecialchars($variable);

            oder

            echo '<input type="text" name="foo" value="', htmlspecialchars($_GET['foo']), '" />";

            Wenn dir jemand "><script>...</script> z.B. bei einem Affenformular ins Feld eintippt, dann hast du ohne htmlspecialchars() plötzlich Javascript-Code mitten in deiner Seite.

            echo "$verabschiedung $name";

  3. echo $begrüßung;

    [...]  name="box$x" [...]

    Wann immer du gedenkst, einen (Variablen-)Namen so zusammensetzen zu wollen, ist die vermutlich bessere Idee ein Array. Wenn du das im HTML-Teil mit [] notierst (name="box[$x]") legt dir PHP in $_POST oder $_GET unter dem Key box ein Array an, in dem du mit foreach jeden Wert erreichen kannst.

    foreach ($_POST['box'] as $key => $value)
        ...

    Siehe auch:

    echo '<pre>'; print_r($_POST);

    echo "$verabschiedung $name";