# DÍA 3, PROYECTO BIENES RAICES: VALIDAR FORMULARIO, CONSERVAR VALORES, SELECT Y SUBIR FICHEROS ## Validar el formulario Para evitar inconsistencias en la bd necesitaríamos validar el formulario, vamos a modificar el crear.php para que antes de enviar los datos a la bd compruebe los datos introducidos. Para ello vamos a crear un array de errores vacía: ``` //controlando los mensajes de error en la validación del formulario $errores=[]; ``` Justo después de la asignación de variables recogidas del $_POST vamos a hacer una comprobación de si se ha introducido la variable y en caso negativo añadirmos un mensaje de error al array de errores. Por ejmplo: ``` $titulo= $_POST['titulo']; //comprobamos los datos if (!$titulo) { $errores[]="Debes añadir un título"; } ``` Como ves, sólo he incluido un valor, completa tu código para que se comprueben todos. Para hacer pruebas sin que se añada nada a la bd mete un "exit" tras la comprobación y antes de la introducción de lo datos. Una vez veamos que se introducen todos los posibles errores debemos poner la introducción dentro de un if que compruebe antes de nada que el array de errores está vacío. ``` //ahora es donde realmente insertamos los valores en la bd //solo se introduce el campo si el array de errores está vacío if(empty($errores)){ $query="INSERT INTO propiedades (titulo, precio, descripcion, habitaciones,wc,estacionamiento, vendedores_id) VALUES ('$titulo', '$precio', '$descripcion', '$habitaciones','$wc','$estacionamiento', '$vendedores_id')"; //echo $query; $resultado=mysqli_query($db,$query); if ($resultado) { echo "Insertado correctamente"; } } ``` Faltaría incluir el html que recorra y muestre los errores: ``` <?php foreach($errores as $error){ ?> <div class="alerta error"> <?php echo $error; ?> </div> <?php } ?> ``` Como ves hemos usado unos cuantos estilos, podríamos avisar al diseñador para que nos lo creara ya que es con sass/gulp e igual no tenemos mucho manejo pero como somos resolutivos instalamos las dependencias y arrancamos el script del gulp para poder procesar las hojas de estilos: ``` //esto es para instalar las dependencias que están reflejadas en el package.json npm i //esto es para arrancar el escrip del gulp que está definido en package.json y configurado en el gulpfile.js npm run dev ``` Creamos el fichero _admin.scss dentro de src/scss/internas ![](https://hackmd.io/_uploads/Syt3hLPg6.png) y en src/scss/app.scss incluimos el correspondiente import al final del fichero: ``` @import 'internas/admin'; ``` Ahora ya podemos crear nuestros estilos en src/scss/internas/_admin.scss ``` .alerta{ padding: .5rem; text-align: center; color: $blanco; font-weight: $bold; text-transform: uppercase; margin: 1rem 0; &.error{ background-color: red; } } ``` ## Llenar los campos con un valor previo Tenemos el siguiente problema, rellenamos todo menos los aparcamientos dará el error y nos tocará la pesadez de labor de rellenar de nuevo todo el formulario. Por usabilidad lo mejor es que dé el error pero se guarden los valores que ya tenías correctamente rellenos. Veamos cómo se hace! Lo primero es en crear.php inicializar las variables que se deben guardar fuera del `if ($_SERVER['REQUEST_METHOD']==='POST')` ``` //inicializando variables para guardar en el formulario $titulo= ''; $precio= ''; $descripcion= ''; $habitaciones= ''; $wc= ''; $estacionamiento=''; $vendedores_id= ''; ``` Por lo tanto cuando ejecutamos el script por primera vez se inicializan a vacías pero podemos asignarlas en el formulario después del error usando el "value" de los inputs de los formularios como sigue: ``` <label for="titulo">Título: </label> <input type="text" id="titulo" name="titulo" placeholder="Título propiedad" value="<?php echo $titulo; ?>"> ``` Una pregunta...¿el textarea acepta el "value"? Haz lo mismo con los valores del resto del formulario y comprueba si al no completar todos los campos efectivamente se guardan los valores. ## Crear un select con los valores de la base de datos Ahora mismo el listado de vendedores no coincide con los de la base de datos, vamos a solucionarlo añadiendo los siguiente justo después de la inicialización de la conexión $bd en crear.php: ``` //consultar para obtener a los vendedores $consulta="SELECT * FROM 'vendedores'"; $resultado=mysqli_query($db,$consulta); ``` Para que se muestren en el formulario debemos dejar el fieldset de Vendedores como sigue: ``` <fieldset> <legend>Vendedor</legend> <select name="vendedores_id"> <option value="">--Seleccione--</option> <?php while ($vendedor=mysqli_fetch_assoc($resultado)){?> <option value="<?php echo $vendedor['id'];?>"> <?php echo $vendedor['nombre']. " ".$vendedor['apellidos']; ?> </option> <?php } ?> </select> </fieldset> ``` Espera...por qué la combinación while-mysqli_fetch_assoc funciona?? por qué no se usa un foreach? Investiga y explica en clase las razones. Pero ahora mismo si ponemos un vendedor y se nos olvida un campo, el dato se pierde, piensa e investiga cómo hacer que también se guarde este dato en caso de error en la validación. En la base de datos falta rellenar un campo que es la fecha de creación del registro, investiga formatos de fecha y cambia el código para que se incluya la fecha en el momento de la creación en formato 2023/09/01, como ayuda haz los ejercicios de [https://www.w3schools.com/php/php_date.asp](https://www.w3schools.com/php/php_date.asp)