---
# System prepended metadata

title: PHP con HTML

---

# PHP con HTML
## Impresion de variables
```php=
<?php 
    $user = Aitor;
    echo "<h1> Esto es un h1 desde php</h1>";
?>

// Forma sencilla de imprimir variables 
<h2> Hola <?= $user ?></h2>
```

## Condicionales
Podemos imprimir código php usando condicionales de php, esto se puede hacer de varias formas:
```php=
<?php

$se_hablo_de_bruno = true;

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Condicionales</title>
</head>
<body>
    
    <h1>ESTO NO SE DEBE DE HACER</h1>
    <?php if ($se_hablo_de_bruno) {

        echo "<b>😧</b>";

    }
    else {

        echo "<b>😁</b>";

    } 
    
    ?>

    <h1>Esto es aceptable</h1>
    <?php if($se_hablo_de_bruno) { ?>
        <b>😧</b>
    <?php } else { ?>
        <b>😁</b>
    <?php } ?>

    // Mejor Forma
    <h1>Esto sí deberías hacerlo</h1>
    <?php if($se_hablo_de_bruno): ?>
        <b>😧</b>
    <?php else: ?>
        <b>😁</b>
    <?php endif; ?>

</body>
</html>
```

La forma recomandada es la siguiente:
```php=
<?php if(condición) :?>
    // codigo
<?php else: :?>
   // codigo
<?php endif; ?>
```

## Bucles
Podemos seguir la misma estructura antes vista para realizar bucles de PHP.

1. while
```php=
    <?php while (cond): ?>
        // codigo
    <?php endwhile; ?>
```
2. for
```php=
    <?php for ($i = 0; $i < 10; $i++): ?>
        // codigo
    <?php endfor; ?>
```
3. foreach
```php=
    <?php foreach ($elements as $element): ?>
        // codigo
    <?php endforeach; ?>
```
## Envio de Archivos
Podemos recoger el envio de archivos de un formulario a través de la variable **$_FILES**.
Está variable es un array que contiene información de los ficheros que hemos mandado a través del formulario, incluida la ruta al archivo de la carpeta temporal donde se guarda el archivo.
Es importante saber que cuándo trabajamos con ficheros dentro de un formulario debemos cambiar el tipo de encriptación a "multipart/form-data" (Por defecto es "application/x-www-form-urlencoded")

*index.php*
```php=
<form action="server.php" method="post" enctype="multipart/form-data">
    
    <label for="image">Imagen</label>
    <input type="file" name="image">
    
    
    <button type="submit">Enviar</button>
    
</form>
```

*server.php*
```php=
<?php

echo "<pre>";
print_r($_FILES);
echo "</pre";

/**
    Ejemplo de salida:
      array(1) {
        ["image"]=>
          array(5) {
          ["name"]=>
          string(9) "fondo.jpg"
          ["type"]=>
          string(10) "image/jpeg"
          ["tmp_name"]=>
          string(24) "C:\xampp\tmp\phpBC2E.tmp"
          ["error"]=>
          int(0)
          ["size"]=>
          int(1426311)
        }
      }
 */

$base_name = $_FILES["image"]["name"];
print $base_name; // nombre del fichero
```

Debemos recordar que las imágenes subidas se guardaran en una carpeta temporal, por lo que serán borradas automáticamente cuando pase un tiempo.
Una forma de conservar dicho archivo es moverlo a otra carpeta, y eso lo podemos resolver con la función *move_uploaded_file*, a la cúal le pasamos como primer parámetro la ruta en la que se encuenta y como segundo a donde lo queremos mover.

```php=
<?php

$file_name = $_FILES["image"]["name"];
$file_path = "./images/$file_name";
$file_tmp_path = $_FILES["image"]["tmp_name"];

move_uploaded_file($file_tmp_path, $file_path);
echo "<h1>Archivo enviado con éxito 😎</h1>";
```

Tengamos en cuenta que si volvemos a enviar la imagen se sobreescibirá, lo ideal seria validar esto para que no suceda.

## Inputs
Las valores que recogemos de cada Input los recogemos a través del nombre que definamos a través de su propiedad *name*.
Sin embargo podemos recoger en diferentes formatos:
- Array
```php=
<input type="text" name="personas[]" />
<input type="text" name="personas[]" />
<input type="text" name="personas[]" />

<?php
    print_r($_POST["personas"]);
    /**
     * 
     * Array (
     *    [0] => valor 1
     *    [1] => valor 2
     *    [2] => valor 3
     * )
     * /
?>
```
- Array Asociativo
```php=
<input type="text" name="persona[nombre]" />
<input type="email" name="persona[email]" />
<input type="tel" name="persona[telefono]" />

<?php
    print_r($_POST["persona"]);
    /**
     * 
     * Array (
     *    ["nombre"] => nombre
     *    ["email"] => email
     *    ["telefono"] => telefono
     * )
     * /
?>
```

Para selecciones múltiples (Múltiples Ficheros, Select, etc), podemos guardar todas las selecciones usando el formato del array.
```php=
<input type="file" name="files[]" multiple/>

<?php
    print_r($_POST["files"]);
    /**
     * 
     * Array (
     *    [0] => valor 1
     *    [1] => valor 2
     *    [2] => valor 3
     * )
     * /
?>
```

## Validación de Formularios
En PHP enviar un formulario no garantiza que los datos se hayan envíado correctamente, pueden llegar datos sin definir o datos vacíos.
Para resolver esto y poder validar la información que nos llega tenemos las siguientes funciones:
- **isset**: Comprueba si se ha seteado un dato o valor, pero no valida si esta vacío o no.
- **empty** Valida si un valor esta vacío o no.

*Ejemplo*
```php=
<?php

$var = $_POST["var"];

if(isset($var) && !empty($var)) {
    echo "Datos correctos";
} else {
    echo "No hay datos";
}
```

### Saneando los datos
Además de validar la correcta recepción de los datos, debemos comprobar que los datos que nos llegan no son maliciosos.
Los usuarios pueden inyectarnos código html, sql o cualquier clase ataque a través de los inputs, para evitar este tipo de ataques PHP nos ofrece algunas funciones:

- **htmlentities**: Susituye aquel código html que nos puedan inyectar por el propio código html como string
- **strip_tags**: Susituye aquel código html que nos puedan inyectar por el texto que contenga dicho código html
- **str_replace**: Sustituye un carácter por otro
- **preg_replace**: Sustituye los carácteres que coincidan con la expresión regular que pasamos como primer parámetro por el carácter que pongamos como segundo parámetro.
- **filter_var**: Esta función nos sanea la variable que le pasamos en base a las constantes sanitizadas que posee PHP (Podemos usar más de una). Las constantes de saneamiento de datos siguen el formato: ***FILTER_SANITIZE_(validacion)***
*Ejemplo*
```php=
<?php
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// $email = "abacva$()@gmail.com"
echo $email; 
// abacva@gmail.com
```
- **filter_var_array**: Nos permite usar la función filter_var para cada uno de los datos de un array en base a otro array con cada uno de los filtros ([Ejemplo](https://www.php.net/manual/es/function.filter-var-array.php))

*Ejemplos*
```php!
<?php
    $htmlentities = htmlentities($name);
    $addslashes = addslashes($username);
    $onlywords = preg_replace("/\d/", "", $username);
    $onlynumbers = preg_replace("/\D/", "", $username);
    $sanitize_int = filter_var($age, FILTER_SANITIZE_NUMBER_INT);
```

### Validación de datos con filter_var
La función filter_var nos permite también validar los datos de nuestro formulario, su comportamiento estará condicionado de la constante que le pasemos como segundo parámetro. 
En el caso de las validaciones las constantes de PHP seguirán el siguiente formato: ***FILTER_VALIDATE_(validacion)***
El resultado de utilizar las constantes de validación sera un booleano.

*Ejemplo*
```php=
<?php

$is_email = filter_var("mrmichi@michisancio.com", FILTER_VALIDATE_EMAIL);

echo $is_email; // true
```

Opcionalmente podemos pasarle otro parámetro, que nos permite agregar ciertas condiciones a nuestro filtro, un flag. 
Las constantes de tipo flag siguen el siguiente formato: ***FILTER_FLAG_(validacion)***
En caso de que no cumpla con la validación el resultado será 'false', pero si pasa la validación nos devolverá el dato.
*Ejemplo*
```php=
<?php

$is_email = filter_var("mrmichi@michisancio.com", FILTER_VALIDATE_EMAIL);

echo $is_email; // mrmichi@michisancio.com
```

[Tipos de Filtros](https://www.php.net/manual/es/filter.filters.php)

## header
La función header nos permite redirigir a otra página, tras el resultado de alguna acción, de la siguiente forma:
```php=
<?php
header("Location: url");
```

Podemos acompañarlo de la palabra reservada **exit** en caso de que queramos que finalice el programa.