Nicole: php-html-jscript leere arrays im Formular

Hallo erst mal ;-),
wenn ich ein formular mit checkboxen als array sende,
erhalte ich ein bei der Ausgabe ein Array, dass
nur die ausgewählten checkboxen als Key enthält.

Also Beispiel 100 Checkboxen , davon 3 angeklickt
ergibt ein kleines Array mit 3 Keys.

Da dachte ich mir, dass musss doch auch mit anderen
Formularelementen gehen, denn das spart Zeit und Performance.
So brauche ich zum Beispiel nur das Array auswerten und nicht auch noch jedes Array auf leer prüfen, insbesondere bei
mehrdimensionalen Arrays.

Beispiel 1:
---------------------------------------
<form>
<select name="xy[]" size="1">
<option value=""></option> <!-- merke:leereintrag vorhanden -->
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
</select>
<input type="submit" value="test">
</form>

Resultat wenn ich Nichts auswähle:
Array
(
    [0] =>
)

// Also Array ist dennoch vorhanden, auch wenn leer.

-------------------------------------

So dachte ich mir zum Testen mal Folgendes aus.
* macht kein Sinn ist aber auch nur ein test
um das Problem leicht zu verstehen.
Beispiel 2:
----------------------
<form>
<select name="xy[]" size="1" onchange="this.value='';">
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
</select>

<!-- merke:leereintrag NICHT vorhanden -->

<input type="submit" value="test">
</form>

Ich wähle also einen Eintrag und durch den Eventhandler
wird der Wert dann doch zurückgesetzt:

Resultat: Kein Array vorhanden ( Also genau was ich möchte)

Um dieses seltsame Verhalten herauszufinden, worin
sich ein leerer statischer Eintrag und ein leerer
dynamischer Inhalt unterscheiden benutzte Ich Folgendes:

Beispiel 3:
------------
<form>
<select name="xy[]" size="1" onchange="this.value='';">

<option value=""></option> <!-- merke:leereintrag vorhanden -->

<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
</select>
<input type="submit" value="test">
</form>

Jetzt das Gleiche: Eintrag wählen(egal welchen)
wird zurückgesetzt und sollte demnach wie Beispiel 2
funktionieren aber...
Resultat wie  Beispiel 1 (array vorhanden aber leer):

Array
(
    [0] =>
)

***************************************

Das Verhalten liegt nicht an der Auswertung, sondern der
Browser (IE6) sendet in Beispiel 2 gar nichts mit, weil leer.

Gar keine Chance habe ich bei normalen textfeldern
(<input type="text"...), da klappts nicht mal mit eventhandlern.

****************************************

Frage 1 : Gibt es eine logische Erklärung für meine Beispiele ?

Frage 2 : Kann man bei Formularen erzwingen,dass leere Arrays
nicht gesendet werden, ausser bei checkboxen ?
*wennmöglich ohne eventhandler oder javascript...

Ihr fragt euch vielleicht warum ich es mir so schwer
mache, sollen doch die leeren Arrays übergeben werden...

Aber zum einen stört mich mein Unwissen ;-)
und ích habe eine Wirtschaftssimulation
geschrieben, die auf manchen Seiten meherere
Hundert Optionen bietet, sowohl durch Texteingabe , pulldown, checkboxen,etc.

Das bei dieser Vielzahl von leeren Arrays,  Es schöner wäre
nur die wirklichen Werte übergeben zu bekommen,
hätte viele Vorteile.

Weiss Jemand rat ?

Gruss
Nikki

  1. Bei einem Select size=1 ohne "multiple"-Attribut brauchst du kein Array. Da kommt _immer_ _ein_ Wert zurück. Es kommt auch nicht "nichts" zurück. Wenn der gewählte Eintrag als value einen Leerstring hat, dann ist das nicht "nichts" sondern eben ein Leerstring.

    Auch wenn du ein leeres <option></option> (ohne value-Attribut) nimmst, erhälst du auch einen Leerstring als Ergebnis. So wird das also nichts.

    Die einzige Möglichkeit, das Element nicht im POST/GET zu haben, ist, ihm ein name-Attribut dynamisch zuzuweisen.

    <select size="1" onchange="name=value">

    Bei der Auswahl der Leer-Option wird der Name auf Leerstring gesetzt und ist nun zwar nicht mehr in PHPs $_POST/$_GET vorhanden, wird aber als "=" (Leerstring als Name und Wert, da bleibt nur das trennende = übrig) übertragen. Es besteht nun außerdem der gravierende Nachteil dass die values dokumentweit eindeutig sein müssen, damit es keine Überschneidungen gibt.

    Entweder
    <option value="xy_a">a</option>
    oder
    <option value="xy[a]">a</option>

    Du musst dann auf das Vorhandensein einer Variablen (isset('xy_a')) oder Array-Keys (array_key_exists('a', $xy)) (oder das jeweilige $_POST/$_GET-Konstrukt) prüfen.

    Ich sehe da keine Zeit- und Performace-Einsparung. Alles in allem ist das nur eine Verkomplizierung die am Ende nichts bringt:

    Um zu wissen, ob etwas gewählt ist, musst du in jedem Fall eine bedingte Anweisung schreiben. Ob du nun testest, welcher Wert gewählt wurde oder testest ob etwas vorhanden ist kommt dann auf das gleiche raus.

    Das Verwenden von Eventhandlern (und damit Javascript o.ä.) und sich dann auf dem Server drauf zu verlassen ist nur in einer geschlossenen Umgebung (Intranet) mit Einheitsbrowser und -einstellungen und Alternativbrowser-Verbot ratsam. Du solltest also schon beim kleinsten gemeinsamen Vielfachen bleiben: reines HTML.

    Vielleicht ist einfach nur deine Auswertelogik im PHP-Script nicht performant genug. Wenn du da was beschleunigen willst solltest du dort ansetzen oder das zur Diskussion stellen.

    1. hallo dedlfix,

      Bei einem Select size=1 ohne "multiple"-Attribut brauchst du kein Array. Da kommt _immer_ _ein_ Wert zurück. Es kommt auch nicht "nichts" zurück. Wenn der gewählte Eintrag als value einen Leerstring hat, dann ist das nicht "nichts" sondern eben ein Leerstring.

      Bei meinen Beispielen habe ich extra darauf hingewiesen, dass
      es sich nur der Einfachheit halber aufs Prinzip beschränkt:
      Natürlich sind es viele Pulldowns mit gleichen Namen, somit
      benötige ich Arrays auch wenn die Pulldowns nicht multiple sind !

      Ich sehe da keine Zeit- und Performace-Einsparung. Alles in allem ist das nur eine Verkomplizierung die am Ende nichts bringt:

      Dann stell Dir mal ein Extrem multidimensionales Array
      vor mit hunderten von Keys und extremen Verschachtelungen.
      Hier ist es wesentlich einfachen nur ein Kleines Array mit den tatsächlich notwendigen Inhalten zu haben, zudem benötigt
      die Übergabe erheblich Zeit weil Diese zum Server geschickt
      wird. Und bei vielen Zugriffen summiert sich das erheblich.

      Stell Dir einfach vor Du sendesz jedesmal den Text eines 300
      Seiten starkes Buches obwohl nur eine textpassage genügen würde.

      Du solltest also schon beim kleinsten gemeinsamen Vielfachen bleiben: reines HTML.

      »»
      Und das war ja auch eine meiner Fragen; "Ob das machbar ist?".

      Gruss
      Nikki