2010-06-03 6 views
5

Comment faire <option selected="selected"> défini par MySQL et PHP?Comment faire pour que <option selected = "selected"> soit défini par MySQL et PHP?

Mon code:

echo '<select>'; 
$tempholder = array(); 
$rs = mysql_query("SELECT * FROM id ORDER BY year"); 
$nr = mysql_num_rows($rs); 
for ($i=0; $i<$nr; $i++){ 
    $r = mysql_fetch_array($rs); 
    //if($year==$r["year"]){ $selected=' selected="selected"'; }//doesn't work so 
    if (!in_array($r['year'], $tempholder)){ 
     $tempholder[$i] = $r['year']; 
     echo "<option>".$r["year"]."</option>";//<option$selected>... 
    } 
} 
unset($tempholder); 
echo '</select>'; 
+0

Pourquoi dans ton commentaire testez-vous $ r ["année"] avant d'avoir assigné $ r? Quelle erreur le code que vous avez essayé vous a-t-il donné? –

+0

@Mark Byers: O.K., je le change. Et cela ne fonctionne pas même après l'affectation de $ r. – Binyamin

Répondre

5

En plus de fixer le =/== Gotcha, vous pouvez vous enregistrer la recherche de tableau et rendre le code plus simple en demandant à la base de données de retourner chaque année une seule fois dans la requête:

<select> 
    <?php $result= mysql_query('SELECT DISTINCT year FROM id ORDER BY year'); ?> 
    <?php while($row= mysql_fetch_assoc($result)) { ?> 
     <option <?php if ($row['year']==$year) { ?>selected="selected"<?php } ?>> 
      <?php echo htmlspecialchars($row['year']); ?> 
     </option> 
    <?php } ?> 
</select> 

(Vous pouvez pas besoin de htmlspecialchars() en supposant que ce soit une année numérique, mais il est recommandé de toujours échapper HTML à tout texte brut que vous incluez dans un modèle HTML.Vous pouvez définir une fonction avec un nom plus court pour faire )

+0

Quelle est la différence entre votre échantillon et le code @ Kau-Boy? Lequel est le plus rapide, le plus sûr, etc., en ignorant 'htmlspecialchars()'? – Binyamin

+0

L'échappement HTML est le seul problème de «sécurité» ici.En ce qui concerne la vitesse, utiliser la base de données plutôt que PHP pour supprimer les années dupliquées comme dans cette réponse serait généralement plus rapide (beaucoup plus rapide s'il y a un * lot * de données), comme dans le code de la question originale. tout le contenu de la table 'id' à extraire de la base de données et renvoyé à PHP. – bobince

+0

L'autre différence principale est que j'ai changé la mise en forme pour utiliser PHP lui-même pour modéliser le contenu en HTML, plutôt que de concaténer puis enchaîner les chaînes, et isoler les structures de blocs ('while' dans ce cas) dans leur propre PHP marque. Cela permet une hiérarchie d'indentation unique et cohérente. C'est un choix purement stylistique, avec peu ou pas d'effet sur les performances, mais je pense que la lisibilité est facilitée. – bobince

2

Vous devez définir $selected chaque fois, et que vous utilisiez l'opérateur d'affectation au lieu de la comparaison:

echo '<select>'; 
$tempholder = array(); 
$rs = mysql_query("SELECT * FROM id ORDER BY year"); 
$nr = mysql_num_rows($rs); 
for ($i = 0; $i < $nr; $i++){ 
    if($year == $r["year"]) { //not $year = $r["year"] 
     $selected=' selected="selected"'; 
    } 
    else { 
     $selected = ""; 
    } 
    $r = mysql_fetch_array($rs); 
    if (!in_array($r['year'], $tempholder)){ 
     $tempholder[$i] = $r['year']; 
     echo "<option$selected>" . $r["year"] . "</option>"; 
    } 
} 
unset($tempholder); 
echo '</select>'; 
+0

Malheureusement, ça ne marche pas **, ça garde toujours l'option 'selected' à la même valeur (à la dernière' année': 2010). – Binyamin

+0

@Binyamin Je n'ai pas tout à fait ce que vous voulez, mais essayez ce code - certainement $ sélectionné n'est pas constant. – Artefacto

6

Essayez celui-ci:

echo '<select>'; 
$tempholder = array(); 
$rs = mysql_query("SELECT * FROM id ORDER BY year"); 
$nr = mysql_num_rows($rs); 
for ($i=0; $i<$nr; $i++){ 
    $r = mysql_fetch_array($rs); 
    if (!in_array($r['year'], $tempholder)){ 
     $tempholder[$i] = $r['year']; 
     echo "<option".(($year==$r["year"])? ' selected="selected"' : '').">".$r["year"]."</option>"; 
    } 
} 
unset($tempholder); 
echo '</select>'; 

Il ne sauvegarde pas l'état dans une variable que vous devez écraser. Et je pense que la véritable erreur était le seul signe égal en $ année = $ r ["année"] et non pas le reste du code.

+0

Merci beaucoup! Ça marche la grille! – Binyamin

+0

Je suis heureux que cela puisse vous aider. – 2ndkauboy

0

Ajout d'un Ew répondez ici pour la postérité, puisque l'ancien code, qui alors qu'il était correct à l'époque (en fait mysqli existait, mais de nombreux hôtes ne supportaient pas PHP 5), utilise malheureusement du code obsolète. Au lieu d'utiliser mysql_ extensions, voici une façon de le gérer à l'aide d'une approche orientée objet qui travaillera avec mysqli_ connexions:

Voici la connexion de base de données

$conn = new mysqli($host, $username, $password, $dbname); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

En supposant que la variable $year provient d'un formulaire (mais il pourrait être utilisé à partir GET ou SESSION ou où)

$year = $_POST['year']; 

Voici la requête pour le bouton d'option (je l'ai cassé dans différentes lignes pour faciliter la lecture):

$result=$conn->query($sql); 
    while($row = $result->fetch_assoc()) {  
     if ($row['year']==$year) { 
      $selected = 'selected="selected"'; 
     } 
     else { 
      $selected = ''; 
     } 
     echo '<option value="'.$row['year'].'" '. $selected . '>"' 
      . $row['year'] .'</option>'; 
    } 
Questions connexes