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