phpbar.de logo

Mailinglisten-Archive

[php] Schleife und "</option>"

[php] Schleife und "</option>"

Sebastian Mendel lists at sebastianmendel.de
Mit Mai 3 13:35:50 CEST 2006


Steffen Kother schrieb:
> Hallo Leute,
> 
> so langsam krieg ich hier noch die Krise.
> 
> In meinem Template habe ich für Auswahlboxen entsprechende Dummies, wie 
> diesen
> 
> <select name="KUNNR" class="KUNNR">
>  <option value="">{KUNNR}</option>
> </select>
> 
> Damit ist das Template erstmal regelkonform.
> 
> Im dazugehörigen Skript soll {KUNNR} nun ersetzt werden. Auch kein 
> Problem. Bevor ich in die Schleife gehe, wird ein leerer Eintrag 
> beendet:
> 
> $option = '&nbsp;</option>';
> 
> An diese Variable werden alle weiteren Einträge gekettet. Für "simple" 
> Sachen wie bei Datumsauswahlfeldern geht alles ohne Probleme, nur wenn 
> ich die Daten aus der Datenbank hole und das zurückgeleiferte Array 
> verwerte, bleibt immer ein schließender Tag (</option>) offen.
> 
> Hier mal die Problemfunktion:
> 
> function listKUNNR($value) {
>     $listKUNNR  = mysql::query('SELECT KUNNR, NAME1 FROM sap_data.kna1 
> ORDER BY KUNNR
>                                ASC');
>     $listKUNNR  = mysql::fetchAll($listKUNNR, NULL, NULL, MYSQL_ASSOC);
> 
>     $listKUNNR2 = array();
> 
>     //Alle unbenötigten Nummern entfernen und gekürzte Kundennummer 
> festhalten
>     foreach($listKUNNR as $index) {
>         $KUNNR = abs($index['KUNNR']);
>         if (strlen($KUNNR) == 7 || strstr($KUNNR, 'CPD')) {
>             $index['absKUNNR'] = $KUNNR;
>             $listKUNNR2[]      = $index;
>         }
>     }
>     $anz_list = count($listKUNNR2);
> 
>     //<option>-Tags erzeugen
>     $option = '&nbsp;</option>';
>     foreach($listKUNNR2 as $kunnr => $index) {
>         $option.= '<option value="'.$index['KUNNR'].'"';
>         if (!empty($_POST[$value]) && $_POST[$value] == $index['KUNNR']) 
> {
>             $option.= ' selected="selected"';
>         }
>         $option.= '>'.$index['absKUNNR'].' 
> '.htmlentities($index['NAME1']);
>         if ($kunnr < $anz_list) {
>             $option.= '</option>';
>         }
>     }
> 
>     return $option;
> }
> 
> Ich habe schon mit verschiedenen Varianten den Vergleich zw. $kunnr und 
> anz_list probiert, es bleibt immer ein </option> übrig...
> 
> Achja, $listKUNNR hat 2208 Einträge (1..2208), in $listKUNNR2 stehen 
> 1522 0..1521). Von daher stimmt der Vergleich ja...
> 
> Kann mir von euch jemand sagen, was ich übersehe? Oder woran die Säge 
> klemmt?

Der Array index beginnt bei 0, macht 0 bis 3 bei 4 Einträgen count 
liefert also 4

Da ist $kunnr _immer_ kleiner als count von diesem Array.

if ($kunnr + 1 < $anz_list) ...


ich würde es eher so machen:


function listKUNNR($value) {
     $value = empty($_POST[$value]) ? false : $_POST[$value];

     $listKUNNR  = mysql::query(
         'SELECT `KUNNR`,
                 `NAME1`
            FROM `sap_data`.`kna1`
        ORDER BY `KUNNR` ASC');
     $listKUNNR  = mysql::fetchAll($listKUNNR, null, null, MYSQL_ASSOC);

     //<option>-Tags erzeugen
     $option = '&nbsp;';
     foreach($listKUNNR as $index) {
         $absKUNNR = abs($index['KUNNR']);
         if (strlen($absKUNNR) != 7 && ! strstr($absKUNNR, 'CPD')) {
             continue;
         }
         $option .= '</option>';
         $option .= '<option value="' . $index['KUNNR'] . '"';
         if ($value == $index['KUNNR']) {
             $option .= ' selected="selected"';
         }
         $option .= '>' . $absKUNNR . ' '
             . htmlspecialchars($index['NAME1']);
     }

     return $option;
}


-- 
Sebastian Mendel

www.sebastianmendel.de

php::bar PHP Wiki   -   Listenarchive