2009-07-26 9 views
1

J'ai une liste déroulante que je construis avec PHP. Voici le code:PHP définir la valeur sélectionnée de la liste déroulante

$region_result = mysql_query("SELECT * FROM region ORDER BY region");  

$dropdown = "<select name='region'>"; 
while($row = mysql_fetch_assoc($region_result)) { 
    $rid = $row["id"]; 
    $region = $row["region"]; 

    $dropdown .= "\r\n<option value='{$row['rid']}'>{$region}</option>"; 
} 
$dropdown .= "\r\n</select>"; 

je dois définir la valeur sélectionnée de la liste déroulante après le code ci-dessus est traité. Y a-t-il un moyen facile de faire cela?

Quelqu'un a-t-il des suggestions? Merci!

EDIT:

Merci à tous pour vos réponses. Laissez-moi vous expliquer ce que je fais. Je configurais une page "Modifier les utilisateurs", dans laquelle vous pouvez rechercher un utilisateur selon plusieurs critères, puis les résultats sont répertoriés dans un "mode d'édition", c'est-à-dire dans des zones de texte et des listes déroulantes. Ainsi, vous pouvez ensuite modifier et mettre à jour un utilisateur. Pour deux champs d'utilisateur, j'ai besoin de lister les données dans des listes déroulantes (pour assurer l'intégrité des données et les contraintes). Donc, je veux montrer ces boîtes déroulantes avec toutes les valeurs possibles que vous pouvez changer, sauf que je veux que la valeur sélectionnée de la liste déroulante soit celle actuellement associée à l'utilisateur. Donc, j'ai été capable de faire fonctionner cela avec la suggestion de deceze - Dans ma boucle while qui a mes valeurs PHP avec les résultats de la base de données, j'ai inséré une boucle while imbriquée qui construira $ dropdown, et dans ce , une if-loop imbriquée. Je ne suis pas fou de toutes ces boucles imbriquées. Voici le segment de code pour que:

if (@mysql_num_rows($result)) { 
     while ([email protected]_fetch_assoc($result)) {  
      $fname = $r["fname"]; 
      $lname = $r["lname"]; 
      $region = $r["region"]; 
      $role = $r["role"]; 
      $extension = $r["extension"]; 
      $username = $r["username"]; 
      $building = $r["building"]; 
      $room = $r["room"];?> 

      <?php 
      $dropdown = "<select name='region'>"; 
      while($row = mysql_fetch_assoc($region_result)) { 
       $rid = $row["id"]; 
       $region2 = $row["region"]; 

       if($region == $region2){ 
        $dropdown .= "\r\n<option selected='selected' value='{$row['rid']}'>{$region}</option>"; 
       }else{ 
        $dropdown .= "\r\n<option value='{$row['rid']}'>{$region2}</option>"; 
       } 
      } 
      $dropdown .= "\r\n</select>"; 
      ?> 

Cependant, je songe à modifier ce au remplacement du texte (proposé par soulscratch et zombat), car je pense qu'il serait mieux sur la performance.

... Cela ne semble pas fonctionner lorsque plus d'un jeu de résultats remplit les critères de recherche, cependant (comme les listes déroulantes pour les résultats 2 et 3 et etc. sont vides).

Qu'en pensez-vous?

+2

Vous devez analyser la chaîne et trouver la bonne valeur = "" avec regex. Pourquoi ne pouvez-vous pas le faire avant qu'il ne soit traité? –

+0

Merci pour votre aide, s'il vous plaît voir mon Edit. – littleK

+0

Je suis tombé sur un problème similaire récemment http://stackoverflow.com/questions/8856207/creating-a-select-menu-in-php-with-default-selected-from-mysql-db/8856255# 8856255 – Ethan

Répondre

7

Avec la façon dont votre chaîne est construit, il est un assez simple str_replace(), ce qui est agréable car il évite les tracas d'avoir besoin des expressions régulières:

$dropdown = str_replace("value='".$rid."'","value='".$rid."' selected=\"selected\"",$dropdown); 
+0

Zombat- Ce n'est pas ce que j'ai actuellement mis en œuvre (voir mon Modifier) , mais je pense à changer ma mise en œuvre à votre suggestion ... – littleK

+1

Dans sa défense, c'est exactement ce que vous avez demandé ... un moyen de le faire après la boucle. – jason

+0

Ça fonctionne comme ça. Beaucoup mieux. Merci! – littleK

1

Si vous voulez changer votre code HTML assemblé après le fait vous devez utiliser des méthodes de remplacement de chaîne compliquées, ou Javascript, ce qui n'est pas un bon choix. La meilleure option que vous avez serait de restructurer votre programme afin que vous puissiez définir l'attribut selected lorsque vous parcourez la boucle la première fois.

+0

Merci beaucoup, j'ai pu restructurer mon code, mais je sais que plusieurs niveaux de boucles imbriquées ... (voir Edit) – littleK

0

Vous pourrez le trouver dans $ _REQUEST [ « région »]

0

Je parie que vous rencontrerez à nouveau ce problème, ce qui signifie qu'il vaudrait la peine de trouver une solution plus flexible. Voici une idée à cette fin:

D'abord, utilisez un tableau pour conserver les options de votre liste déroulante.Si vous avez besoin de plusieurs éléments de sélection avec les mêmes options, vous réutiliser le tableau gratuitement:

$options = array(); 
while ($row = mysql_fetch_assoc($region_result)) { 
    $options[$row['id']] = $row['region']; 
} 

Ensuite, vous pouvez nourrir cela en une fonction qui génère une commande de sélection:

function getSelect ($name, $options, $current) 
{ 
    $markup = '<select name="' . htmlspecialchars($name) . '">'; 
    foreach ($options as $value => $label) 
    { 
    $selected = ($value == $current) ? ' selected="selected"' : ''; 
    $markup .= sprintf(
     "<option value=\"%s\"%s>%s</option>\r\n", 
     htmlspecialchars($value), 
     $selected, 
     htmlspecialchars($label) 
    ); 
    } 
    $markup .= '</select>'; 
    return $markup; 
} 

(vous pouvez également ajouter un ou plusieurs option paramètres pour régler le id, class, etc.)

En outre, vous avez mentionné que vous envisagez des méthodes de commutation en raison de la vitesse, mais il est très peu probable que ce soit le moment et le lieu s'inquiéter de perfo rmance. Concentrez-vous sur le code maintenable maintenant, et tous les réglages de performance qui deviendront nécessaires plus tard seront plus faciles et plus efficaces.

+0

hé merci pour cela. comment faites-vous les valeurs d'option pour commencer à 1 et non 0? – Jonathan

+0

@Jonny: Je ne suis pas sûr de ce que vous voulez dire. Les valeurs proviennent de la colonne 'id' de votre table de base de données, n'est-ce pas? – grossvogel

Questions connexes