PHP imposta il valore selezionato della casella a discesa

Ho un box a tendina che costruisco con PHP. Ecco il codice:

$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>"; 

Ho bisogno di impostare il valore selezionato della casella a cascata dopo che il codice di cui sopra viene elaborato. C'è un modo semplice per farlo?

Qualcuno ha qualche suggerimento? Grazie!

MODIFICARE:

Grazie a tutti per le vostre risposte. Lascia che ti spieghi cosa sto facendo. Stavo impostando una pagina "Modifica utenti", in cui è ansible cercare un utente in base a più criteri e quindi i risultati sono elencati in una "modalità di modifica", ovvero in caselle di text e caselle a discesa. Quindi puoi modificare e aggiornare un utente. Per due campi utente, ho bisogno di elencare i dati nelle caselle a discesa (per garantire l'integrità dei dati e i vincoli). Quindi, voglio mostrare quelle caselle a discesa con tutti i possibili valori a cui puoi passare, tranne che voglio che il valore selezionato del menu a discesa sia quello attualmente associato all'utente.

Quindi, sono stato in grado di farlo funzionare con il suggerimento di deceze – Nel mio ciclo while che ha impostato i miei valori PHP con i risultati del database, ho inserito un ciclo while annidato che costruirà $ dropdown, e al suo interno, un nidificato se -ciclo continuo. Non sono pazzo di tutti questi loops annidati. Ecco il segmento di codice per questo:

  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>"; ?> 

Comunque, sto considerando di cambiare questo aspetto con la sostituzione del text (suggerito da soulscratch e zombat), poiché penso che sarebbe meglio sulle performance.

… Questo non sembra funzionare quando più di un set di risultati soddisfa i criteri di ricerca, sebbene (come le caselle a discesa per il 2 ° e 3 ° e risultati ecc. Sono vuoti).

Che cosa ne pensate?

Con il modo in cui è costruita la tua string, è abbastanza semplice str_replace () , che è bello in quanto salva la seccatura di aver bisogno di espressioni regolari:

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

Se vuoi cambiare il tuo HTML assemblato dopo il fatto che devi usare complicati methods di sostituzione delle stringhe, o Javascript, nessuno dei due è una buona scelta.

L'opzione migliore è quella di ristrutturare il programma in modo da poter impostare l'attributo selected quando si passa attraverso il ciclo la prima volta.

Sarai in grado di trovarlo in $ _REQUEST ['regione']

Scommetto che ti imbatterai nuovamente in questo problema, il che significa che sarebbe utile proporre una soluzione più flessibile. Ecco un'idea verso quella fine:

Innanzitutto, utilizzare un arrays per contenere le opzioni per il proprio elenco a discesa. Se hai bisogno di più elementi di selezione con le stesse opzioni, puoi riutilizzare l'arrays gratuitamente:

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

Quindi, puoi inserire questo in una function che genera un controllo selezionato:

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

(Puoi anche aggiungere uno o più parametri facoltativi per impostare l' id , la class , ecc.)

Inoltre, hai detto che stavi considerando di cambiare metodo a causa della velocità, ma è molto improbabile che questo sia il momento e il luogo in cui preoccuparti delle performance. Concentrati ora sul codice gestibile e qualsiasi modifica delle performance che sarà necessaria in seguito sarà più semplice ed efficace.