2010-06-03 4 views
5

¿Cómo hacer <option selected="selected"> establecido por MySQL y PHP?¿Cómo hacer <opción seleccionada = "seleccionada"> establecida por MySQL y PHP?

Mi código:

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

¿Por qué en su comentario está probando $ r ["año"] antes de haber asignado $ r? ¿Qué error te da el código que probaste? –

+0

@Mark Byers: O.K., lo cambio. Y no funciona incluso después de la asignación '$ r'. – Binyamin

Respuesta

5

Además de la fijación de la Gotcha =/==, puede ahorrarse la consulta de matriz y hacer el código más simple preguntando a la base de datos para volver cada año sólo una vez en la consulta:

<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> 

(Usted puede no es necesario htmlspecialchars() suponiendo que es un año numérico, pero es una buena práctica siempre para HTML-escape de cualquier texto sin formato que incluya en una plantilla HTML. Puede definir una función con un nombre más corto para hacer el echo htmlspecialchars para cortar al escribir )

+0

¿Cuál es la diferencia entre tu muestra y el código @ Kau-Boy? ¿Cuál es más rápido, más seguro, etc. ignorando 'htmlspecialchars()' add? – Binyamin

+0

El escapado de HTML es el único problema de 'seguridad' aquí.En cuanto a la velocidad, usar la base de datos en lugar de PHP para descartar los años duplicados como en esta respuesta generalmente sería más rápido (significativamente más rápido si hay un * lote * de datos), como en el código de pregunta original y la versión de Kau-Boy requiere el todo el contenido de la tabla 'id' se extraerá de la base de datos y se devolverá a PHP. – bobince

+0

La otra diferencia principal es que he cambiado el formato para usar PHP para moldear el contenido en HTML, en lugar de concatenar y luego hacer eco de cadenas y aislar las estructuras de bloques ('while' en este caso) en su propio PHP etiqueta. Esto permite una jerarquía de sangría única y consistente. Esta es una elección puramente estilística, con poco o ningún efecto en el rendimiento, pero creo que se ayuda a la legibilidad. – bobince

2

Debe definir $selected cada vez, y que estaba usando el operador de asignación en lugar de la comparación:

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

Desafortunadamente ** no funciona, **, mantiene siempre la opción 'seleccionada' en el mismo valor (al último 'año': 2010). – Binyamin

+0

@Binyamin No conseguí exactamente lo que deseaba, pero pruebe este código; ciertamente $ selected no es constante. – Artefacto

6

prueba este:

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>'; 

No guarda el estado en una variable que debe sobrescribir.

Y creo que el error real fue el signo igual en $ year = $ r ["year"] y no en el resto del código.

+0

¡Muchas gracias! ¡Funciona! – Binyamin

+0

Me alegro de que pueda ayudarte. – 2ndkauboy

0

Añadiendo un Nueva respuesta aquí para la posteridad, ya que el código anterior, que aunque correcto en ese momento (en realidad mysqli sí existía, pero muchos hosts no admitían PHP 5), desafortunadamente usa código obsoleto. En lugar de utilizar mysql_ extensiones, aquí hay una manera de manejar la situación con un enfoque orientado a objetos que funcionará con mysqli_ conexiones:

Aquí está la conexión de base de datos

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

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

Suponiendo que la variable $year está viniendo de una forma (aunque podría ser utilizado desde GET o SESSION o donde sea)

$year = $_POST['year']; 

Aquí está la consulta para el botón de opción (la tengo rota en diferentes filas para que sea un poco más fácil de leer):

$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>'; 
    } 
Cuestiones relacionadas