---
# System prepended metadata

title: 'DÍA 3, PROYECTO BIENES RAICES: VALIDAR FORMULARIO'
tags: [php]

---

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