2010-06-03 4 views
0

J'ai actuellement un formulaire construit dans lequel, après validation, si des erreurs existent, les données restent à l'écran pour le consommateur à corriger. Un exemple de la façon dont cela fonctionne pour dire « Année de naissance » est:Problème avec la valeur 'sélectionnée' dans le formulaire

<select name="DOB3"> 
    <option value="">Year</option> 
    <?php 
     for ($i=date('Y'); $i>=1900; $i--) 
    { 
    echo "<option value='$i'"; 
    if ($fields["DOB3"] == $i) 
     echo " selected"; 
    echo ">$i</option>"; 
    } 
    ?> 
</select> 

Si une erreur est trouvée, l'année de la valeur de naissance retourne l'année précédente est entré. Je suis capable d'avoir ce travail sur tout le champ à l'exception de mon champ 'Etat'. Je construis le tableau et la fonction de la chute vers le bas avec le code suivant:

<?php 

$states_arr = array('AL'=>"Alabama",'AK'=>"Alaska",'AZ'=>"Arizona",'AR'=>"Arkansas",'CA'=>"California",'CO'=>"Colorado",'CT'=>"Connecticut",'DE'=>"Delaware",'DC'=>"District Of Columbia",'FL'=>"Florida",'GA'=>"Georgia",'HI'=>"Hawaii",'ID'=>"Idaho",'IL'=>"Illinois", 'IN'=>"Indiana", 'IA'=>"Iowa", 'KS'=>"Kansas",'KY'=>"Kentucky",'LA'=>"Louisiana",'ME'=>"Maine",'MD'=>"Maryland", 'MA'=>"Massachusetts",'MI'=>"Michigan",'MN'=>"Minnesota",'MS'=>"Mississippi",'MO'=>"Missouri",'MT'=>"Montana",'NE'=>"Nebraska",'NV'=>"Nevada",'NH'=>"New Hampshire",'NJ'=>"New Jersey",'NM'=>"New Mexico",'NY'=>"New York",'NC'=>"North Carolina",'ND'=>"North Dakota",'OH'=>"Ohio",'OK'=>"Oklahoma", 'OR'=>"Oregon",'PA'=>"Pennsylvania",'RI'=>"Rhode Island",'SC'=>"South Carolina",'SD'=>"South Dakota",'TN'=>"Tennessee",'TX'=>"Texas",'UT'=>"Utah",'VT'=>"Vermont",'VA'=>"Virginia",'WA'=>"Washington",'WV'=>"West Virginia",'WI'=>"Wisconsin",'WY'=>"Wyoming"); 

    function showOptionsDrop($array, $active, $echo=true){ 
     $string = ''; 

     foreach($array as $k => $v){ 
      $s = ($active == $k)? ' selected="selected"' : ''; 
      $string .= '<option value="'.$k.'"'.$s.'>'.$v.'</option>'."\n";  
     } 

     if($echo) { echo $string;} 
     else {  return $string;} 
    } 
?> 

J'appelle alors la fonction à partir de la forme en utilisant:

<td><select name="State"><option value="">Choose a State</option><?php showOptionsDrop($states_arr, null, true); ?></select></td> 

Je ne sais pas ce que je suis absent, mais aimerais toute aide si quelqu'un voit l'erreur dans mon code.

Merci!

Répondre

1

Jetez un oeil sur le code:

<?php showOptionsDrop($states_arr, null, true); ?> 

Vous passez null, donc $active sera toujours null. La condition

($active == $k) 

se jamais nous évaluer à true.

Vous devez passer la valeur que vous obtenez de la forme au lieu, par exemple:

<?php showOptionsDrop($states_arr, isset($fields['State']) ? $fields['State'] : null, true); ?> 

Vous devriez vraiment essayer de séparer le PHP du code HTML, en particulier dans votre premier exemple

Mise à jour:

En fait ce n'est pas beaucoup, mais pensez à utiliser le alternative syntax for control structures:

<select name="DOB3"> 
    <optgroup label="Year"> 
    <?php for ($i=date('Y'); $i>=1900; $i--) : ?> 
     <option value="<?php echo $i ?>" 
      <?php echo ($fields["DOB3"] == $i) ? 'selected="selected"' : '' ?> > 
      <?php echo $i ?> 
     </option> 
    <?php endforeach; ?> 
    </optgroup> 
</select> 

Aussi, si vous voulez donner les options une sorte d'étiquette, vous pouvez le faire avec le optgroup balise HTML (ce n'est pas sélectionnable).

+0

merci pour l'endroit. J'ai regardé cette ligne pendant une heure maintenant! Que voulez-vous dire en particulier en séparant le PHP et le HTML, en particulier dans cette instance particulière. J'ai besoin de créer un formulaire avec des critères de sélection des années et de le faire en premier lieu laisse beaucoup de code. – JM4

+1

@ JM4: Voir ma mise à jour. En fait, ce n'est pas trop mal (je pensais qu'il serait peut-être préférable de générer les valeurs au préalable, mais cela ne fait pas de différence). Mais imo, la syntaxe alternative est beaucoup plus lisible et il est plus facile de repérer les erreurs dans votre HTML. Mais vous pouvez envisager de définir l'année en cours et l'année jusqu'à un peut sélectionner à l'avance. –

Questions connexes