jueves, 16 de julio de 2020

Cargar datos en una lista desplegable con PHP

Supongamos que queremos agregar un registro a una tabla que se relaciona mediante una clave foránea con otra, solo requiere que se le ingrese el código o id, pero colocar ello en una caja de texto es incómodo, lo ideal sería desplegar en una lista desplegable vertical los registros de la tabla cuyo identificador o código queremos mostrar. Ilustremos ello con un ejemplo:


Sin lista desplegable Con lista desplegable

Agregar datos







Agregar datos








Trabajaremos con las siguientes tablas:




Ahora vamos a crear ese formulario donde se puedan cargar los datos de "inquilinos" y enviar el "id" a través de un formulario web. Este ejemplo no emplea programación orientada a objetos y nos limitamos a enviar la información.

Creamos el formulario en el archivo"pagoIns.php"
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form class="jpcss" method="post" action="agregar_pago.php">    
            <fieldset>
                <legend>INGRESAR ABONO</legend><br> 
                Ingrese al aportante: <select name="personas">
                    <!--Aquí ira el código PHP-->
                </select><br><br>
                Ingrese el importe: S/ 
                <input type="number" name="importe" min="0.01" step="0.01" value="0.01"><br>  
                <br><br>
                <button onclick="return confirm('¿Seguro que deseas ingresar el pago?')">
                    INGRESAR
                </button>  
            </fieldset>
        </form>
    </body>
</html>

Ahora vamos a realizar tanto la conexión como la consulta SQL en código PHP
<?php
#Parámetros de la BD
$cfg['h'] = 'localhost';  #hostname
$cfg['u'] = 'root';       #usuario
$cfg['p'] = '';           #contraseña (password)
$cfg['b'] = 'blog';       #base de datos
$cfg['r'] = '3306';       #puerto 
#Conexión
$cnx = mysqli_connect($cfg['h'], $cfg['u'], $cfg['p'], $cfg['b'], $cfg['r']);
mysqli_query($cnx, "set names utf8");

#Consulta SQL
$sql = "SELECT idinquilinos id, "
        . "CONCAT_WS (' ',nombres,paterno,materno) "
        . "datos FROM inquilinos;";

#Capturando los datos
$bolsa = mysqli_query($cnx, $sql);
$salida = array();
if ($bolsa != null) {
    while ($row = mysqli_fetch_assoc($bolsa)) {
        $salida[] = $row;
    }
    mysqli_free_result($bolsa);
} else {
    $salida = false;
}
unset($row);
?>

Ese código lo colocaremos al inicio de la siguiente forma. Agregando el código que muestra los datos en la lista desplegable.
<?php
#Parámetros de la BD
$cfg['h'] = 'localhost';  #hostname
$cfg['u'] = 'root';       #usuario
$cfg['p'] = '';           #contraseña (password)
$cfg['b'] = 'blog';       #base de datos
$cfg['r'] = '3306';       #puerto 
#Conexión
$cnx = mysqli_connect($cfg['h'], $cfg['u'], $cfg['p'], $cfg['b'], $cfg['r']);
mysqli_query($cnx, "set names utf8");

#Consulta SQL
$sql = "SELECT idinquilinos id, "
        . "CONCAT_WS (' ',nombres,paterno,materno) "
        . "datos FROM inquilinos;";

#Capturando los datos
$bolsa = mysqli_query($cnx, $sql);
$salida = array();
if ($bolsa != null) {
    while ($row = mysqli_fetch_assoc($bolsa)) {
        $salida[] = $row;
    }
    mysqli_free_result($bolsa);
} else {
    $salida = false;
}
unset($row);
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form class="jpcss" method="post" action="agregar_pago.php">    
            <fieldset>
                <legend>INGRESAR ABONO</legend><br> 
                Ingrese al aportante: <select name="personas">
                    <!--Código PHP-->                    
                    <?php
                    if ($salida) {
                        foreach ($salida as $persona) {
                            ?>
                            <option value="<?= $persona['id'] ?>">
                                    <?= $persona['datos'] ?>
                            </option>
                        <?php }
                    }
                    ?>                
                </select><br><br>
                Ingrese el importe: S/ 
                <input type="number" name="importe" min="0.01" step="0.01" value="0.01"><br>  
                <br><br>
                <button onclick="return confirm('¿Seguro que deseas ingresar el pago?')">
                    INGRESAR
                </button>  
            </fieldset>
        </form>
    </body>
</html>

Entre las líneas 42 y 51 se aprecia el código que despliega los datos en la lista desplegable pudiendo obtener el efecto deseado. Se emplea antes del foreach un condicional, en caso la tabla se encuentre vacía u ocurra un error.