Función que escribe un campo select con valores de una base de datos

  • Por
En el interior se encuentra una función que escribirá, en un formulario, un campo select con valores resultado de la devolución de una consulta. Cómodo y efectivo.

Durante el trabajo con formularios en PHP, en muchas ocasiones tenemos un campo select cuyos valores posibles se obtienen de una base de datos, por ejemplo, los países. En este taller vamos a mostrar una función que es capaz de escribir en un formulario un campo de select, obteniendo los valores de una tabla de la base de datos. Con esta función podemos olvidarnos de la complejidad de mostrar un campo select. Simplemente llamamos a la función, enviando los parámetros, y se encarga de mostrar el campo.

En el caso de los países, puede que sea una buena idea tener una tabla con la lista de países del mundo. En el formulario lo habitual es permitir escoger un país de la lista y enviar el código del país. De modo podemos estar seguros de que todos los usuarios han elegido un país de la lista, entre todos los posibles.

La tabla de países podría contener algo como esto:

Este es el código HTML de un posible formulario cuyo campo de países ha sido extraído de la anterior tabla:

<form> 
Nombre: <input type=text name="nombre"> 
<br> 
País: 
<select name=id_pais> 
   <option value=1>España 
   <option value=2>México 
   <option value=3>Argentina 
   <option value=4>Colombia 
   <option value=5>Chile ... 
</select>

Ahora vamos a ver cómo se haría la función que recorre la tabla de la base de datos para mostrar el select del país. Para empezar vamos a ver una lista de los parámetros que acepta.

  • ssql: sentencia SQL que permita extraer los datos de las posibles opciones del select. La sentencia SQL tendría una forma como esta "select id_pais, nombre_pais from pais". En la primera columna de los registros seleccionados con esta sentencia, se espera el value de los option (en este caso id_pais). En la segunda columna se espera el texto de los option.
  • valor: En este parámetro se recibe el valor predeterminado que debe aparecer en el select. Este valor se compara con el primer campo de la sentencia SQL. (Si deseamos que el valor predeterminado fuera "España", deberíamos poner un 1 como valor).
  • nombre: Es el nombre que se le da al campo select de formulario.

El código de la función es el siguiente:

function saca_menu_desplegable($ssql,$valor,$nombre){ 
  	echo "<select name='$nombre'>"; 
  	$resultado=mysql_query($ssql); 
  	while ($fila=mysql_fetch_row($resultado)){ 
    	if ($fila[0]==$valor){ 
      	echo "<option selected value='$fila[0]'>$fila[1]";	
    	} 
    	else{ 
      	echo "<option value='$fila[0]'>$fila[1]";	
    	} 
  } 
  	echo "</select>";	
}

Se escribe el campo de formulario select, indicando el nombre del campo que se ha recibido por parámetro. Luego se realiza una búsqueda en la base de datos, ejecutando la sentencia SQL recibida por parámetro.

Más tarde se hace un recorrido del conjunto de registros que se han encontrado en la base de datos y se escriben cada uno de los option. Para cada uno de los registros se comprueba si su identificador es igual al que se desea marcar como valor predeterminado. En caso de serlo, se escribe el option con el atributo selected.

Un detalle importante es que la función necesita tener una conexión abierta con la base de datos, pues en caso contrario no se podría ejecutar la sentencia SQL.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

sandra

24/5/2005
Muy bueno, gracias.
Podrías decir cómo se hace para que ese select me vaya mostrando las que empiezan por las letras que yo pulso, si pulso p aparecen las que empiezan por p pero si pulso o aparecen las que empiezan por o y yo quiero que sean las po.
Gracias

Diego

14/10/2005
Hola gente.
supongamos q tengo una tabla llamada "sectores" asi

id_sector nombre
0 compras
1 ventas
2 deposito
... .....

y en un formulario muestro un select, en base a esa tabla
lo que quiero es recibir en otra pagina el nombre, y no el ID.
Lo que hice fue hacer una nueva consulta. Ejemplo:

//recibo el valor que viene del select cuyo nombre es 'sector'
//dicho valor es el id, no el nombre
$sector=$_POST['sector'];

// lo que hago para obtener el nombre, es hacer una consulta nuevamente a la base
// sobre la tabla de sectores, donde busco por id_sector, o sea por el valor de $sector
$consulta_sector=mysql_query("SELECT nombre FROM sectores WHERE id_sector='$sector'") or die(mysql_error());
$fila=mysql_fetch_row($consulta_sector);


y listo, en $fila[0] tengo el nombre de ese sector, y no el id


Bueno, espero ser de ayuda. Mis conocimientos en php son pocos
espero sepan disculpar si me equivoque en algo :)

saludos!!!!

juandde

24/4/2006
hola a todos, soy nuevo en esto del php y el mysql, pero la verdad es que esta pagina me esta ayudando muchisimo, por eso para intentar agradecer vuestra ayuda yo tbn tratare de resolver duda en medida de mis posibilidades:

he utilizado este script y lo he modificado algo, pero tratare de aclararselo a la gente con dudas, quedando el script asi:

function saca_menu_desplegable($sentencia,$valor,$nombre)
{
$cogidovalor=0;
echo "<select name=$nombre>";
$resultado=mysql_query($sentencia) or die (mysql_error());
while ($fila=mysql_fetch_row($resultado))
{
if ($fila[0]==$valor)
{
echo "<option selected value='$fila[0]'>$fila[1]";
$cogidovalor=1;
}
else
{
echo "<option value='$fila[0]'>$fila[1]</option>";
}
}
if ($cogidovalor==0)
{
echo '<option value="0" selected></option>';
}

echo "</select>";
}

Ademas desde el fichero que contiene el formulario y llama a la funcion queda así:

<?php
$consulta="select idzona, zona from zona";
saca_menu_desplegable($consulta,$agridzona, 'agridzona');

?>

Paso a comentar:
El script tal cual es esta preparado para recuperar 2 columnas, la primera columna recupera un ID de cualquier cosa, en mi caso el de una zona, y en la segunda columna recupera el nombre que lleva asociado esta ID, de esta manera en el menu que se despliega vemos el nombre, pero internamente solo se guarda la ID. Si por ejemplo quisieramos guardar el nombre en vez de la ID habria que cambiar algo el codigo y escribir
echo "<option value='$fila[1]'>$fila[1]</option>";
Personalmente, si se quiere hacer esto, seria mejor seleccionar solo el campo nombre en la consulta y escribir
echo "<option value='$fila[0]'>$fila[0]</option>";
la segunda variable del script, nos permite seleccionar de antemano una de las opciones de la lista desplegable, esto es util si utilizamos el formulario para editar registros que ya teniamos almacenados en la BD.
La tercera variable es como queremos que se llame nuestro campo del formulario.
Acerca de los cambios introducidos en el script, he incluido una variable interna $valorcogido, que me permite escribir un campo en blanco dejandolo seleccionado, si al recibir los datos del formulario se hace un buen filtrado y obligamos a rellenar este campo nos evitaremos selecciones erroneas por descuido.
Espero haberme explicado con la suficiente claridad como para ser entendido, si no es asi, lo siento e intentare resolveros más dudas.
Salu2 desde cuenca city.

Hoover

06/5/2010
Resaltar lo interesante del sitio
Seguí el ejemplo de la Función que escribe un campo select con valores de una base de datos y no he tenido exito no me muestra los datos me abre el campo parece que ha recorrido la tabla pero muestra los datos el campo es muy pequeño no muestra ningun dato.

<select name="op_auxiliar">
<?php
$db = mysql_pconnect("localhost", "root", "contraseña");

if (!$db)
{
echo "Error: No se ha podido conectar a la base de datos.";
exit;
}

mysql_select_db("pcv");
$consulta = "select nombre,Identificacion from auxiliares ";
$resultado = mysql_query($consulta);
while ($row = mysql_fetch_row($resultado))
{
echo "<option value='$row[0]'>$op_auxiliar</option>";
}
?></select></p>

Carlos lozada

13/11/2010
Inquietud!!!
hola ya que veo su codigo me seria de gran ayuda que me colaboraras ya que yo estoy enpezando a manejar php y necesito extraer lo que tengo en la base de datos y que me los datos me los muestre en los option del select yo tenia algo asi:

<?php

$consult="select nom_papel, valor_papel from papel;";
$result=mysql_query($consult);
$fila=mysql_fetch_array($result);
?>

<select name="ClasePapel" id="ClasePapel">
<option value=<?php echo $fila["nom_papel"];?>><?php echo $fila["nom_papel"];?></option>
</select>

pero solo me muestra en el select un dato y pues me gustaria poder elegir mas opciones el select en la pagina se ve asi:

Clase de papel: bond 65 grs
<input type:text>---<select><option>bond 65 grs</option>

asi saldria en mandandolo normal lo escribo asi para que me puedan entender de que es lo que necesito y me puedan ayudar

y me gustaria saber como mando todo lo que tengo en la tabla
la tabla se llama papel los atributos son 3 el cod_papel , nom_papel y el valor_papel

espero que me puedan colaborar con esto
muchas gracias.

Homero

14/12/2010
Select
Hola!

Muy bueno el articulo, ahora, necesito utilizar el valor de la selección, como lo hago?.
Gracias Anticipadas.

Johanes

29/2/2012
tomar valor de un select
este select toma el valor que es cargado por una consulta en la base postgresql que utiliza mysql, ya es totalmente funcional y se puede utilizar para guardar en bd por medio de post


<select style="font-size:14px" name="areaF" id="areaF" >
<option>Seleccione area...</option>
<?php
require("scripts/conexion.php");
$result = pg_query($conexion, "select id_areafuncional,descareafuncional from sch_catalogos.cat_areafuncional order by descareafuncional ;");
if (!$result) {
echo "Sin conexión. ";
exit;
}
while ($row = pg_fetch_row($result)) {
echo "<option value='$row[1]'>$row[1]";
//echo '<option value='.$row[1].'>'.$row[1].'</option>' ;
}

?>
</select>

Alejandro

22/4/2017
me salio de esta manera
<select class="form-control" id="formGroupExampleInput" name="IdTiPe" placeholder="Id Tipo de permiso">
<option>Id Tipo de Permiso</option>
<?php
require ("../../Conexion/conexion.php");
$db = Connection();
$db->debug();

$sql = "SELECT * FROM tiposdepermisos ORDER BY IdTipoDePermiso";
$params = array();
$db->query($sql,$params);

while ($row=$db->next()) {
echo "<option> {$row-> IdTipoDePermiso} </option>";
} ?>
</select>

sin embargo lo intento repetir de la misma manero con otro dato en el mismo formulario y no me sale como tal apesar de escribirlo tal y como esta la otra tabla

Patrizio

26/11/2017
Obsoleto PHP
MySQL ya no tiene soporte en PHP7+
Estaria bueno rehacer los ejemplos y tutoriales con MySQLi ...
Gracias