martes, 8 de agosto de 2017

CONCATENAR CADENAS

FUNCIONES CON CADENAS DE CARACTERES EN PHP.
Las cadenas de caracteres en PHP se definen, como ya sabemos, entre comillas dobles o simples (podemos usar dobles o simples indistintamente). Es decir, podemos definir una variable como cadena de caracteres de la siguiente forma: $cadena = "George Washington"; o también $cadena = 'George Wasington';

 
Para la manipulación de estas variables o cadenas de caracteres nos será útil conocer las funciones básicas de manipulación. No vamos a entrar a describir cada una de las funciones para cadenas de caracteres que PHP posee, que son muchas. Simplemente veremos las más básicas y de uso más común.


FUNCIÓN STRLEN
La función strlen obtiene la longitud de una cadena y devuelve un número entero. Es decir, obtenemos el número de caracteres que forman la cadena completa.
Escribe este código en un editor como Notepad++ y guárdalo con un nombre de archivo como ejemplo1.php. A continuación, sube el fichero al servidor y visualiza el resultado.
<?php
$cad = "cadena"; //Prueba a cambiar el texto cadena por otro
$n = strlen($cad);
echo "La longitud de la cadena es: $n";
?>

FUNCIÓN SUBSTR
La función substr devuelve una subcadena de la cadena original, es decir, una parte de la cadena original. Esta función tiene 3 parámetros:
  1. La variable que contiene la cadena.
  2. Número que representa la posición (inclusive) en la que comenzará a ser extraída la subcadena.
  3. Número que indica la cantidad de caracteres que serán extraídos. Este argumento es opcional. Si se omite se tomará hasta el final de la cadena original.

Tener en cuenta que la numeración de la posición de los caracteres empieza por cero. Por ejemplo para la cadena 'GPS', que tiene 3 caracteres, el carácter en posición 0 es G, en posición 1 es P y en posición 2 es S. No existe la posición 3 debido a que se comienza a contar por el cero.
Escribe este código en un editor como Notepad++ y guárdalo con un nombre de archivo como ejemplo2.php. A continuación, sube el fichero al servidor y visualiza el resultado.
<?php
$cad = "cadena";
$sub1 = substr($cad, 2);
$sub2 = substr($cad, 2, 2);
echo "La subcadena número uno es la siguiente: $sub1 <br />";
echo "La subcadena número dos es la siguiente: $sub2";
?>


Escribe este otro ejemplo y visualízalo en tu navegador (nota: & nbsp; representa un espacio en blanco):
<?php
$cad = "aprenderaprogramar.com";
$sub1 = substr($cad, 0); //La cadena completa
$sub2 = substr($cad, 0, 8); //La subcadena aprender
$sub3 = substr($cad, 8, 1); //La subcadena a
$sub4 = substr($cad, 9); //La subcadena programar
echo "& nbsp; & nbsp; La subcadena número uno es la siguiente: $sub1 <br />";
echo "& nbsp; & nbsp; La subcadena número dos es la siguiente: $sub2 <br />";
echo "& nbsp; & nbsp; La subcadena número tres es la siguiente: $sub3 <br />";
echo "& nbsp; & nbsp;La subcadena número cuatro es la siguiente: $sub4";
?>

Fíjate en las siguientes cuestiones:
a) La numeración de caracteres empieza en cero y no en uno. Así en este último ejemplo el caracter 0 es la a, el 1 la p, el 2 la r, el 3 la e y así sucesivamente.
b) La posición en que comienza la extracción va incluida en la subcadena extraida. Esto significa que substr ($cad, 0, 1) significa que sólo se extrae el primer caracter de la cadena.

 OPERADOR DE CONCATENACIÓN
La concatenación es el proceso de unir varias porciones de texto en una sola cadena. Este operador se expresa como un punto '.'
Escribe el siguiente código, súbelo al servidor y visualízalo en tu navegador.
<?php
$cad1 = "aprendera";
$cad2 = "programar";
$cadt = $cad1 . $cad2;
echo "La cadena número uno concatenada con la cadena número 2 es: $cadt <br />";
// Ahora concatenaremos la cadena ejemplo con la concatenación de $cad2 y $cad1
echo "Ejemplo: " . ($cad2 . $cad1);
?>


En este ejemplo vemos cómo las cadenas se pueden concatener en el orden que nosotros deseemos.

FUNCIONES CADENAS PHP

FUNCIONES BÁSICAS EN PHP
PHP además de permitirnos definir nuestras propias funciones, dispone de una gran cantidad de funciones propias del lenguaje a las que se denomina “funciones nativas” o “funciones del core o núcleo php”. Ya conocemos algunas de ellas como strlen y substr. Vamos a ver otras funciones muy usadas relacionadas con el manejo de cadenas de caracteres (texto).

FUNCIÓN STR_REPLACE
Esta función se utiliza para reemplazar caracteres dentro de una cadena de caracteres. Es decir, nos permite definir una cadena que debe ser reemplazada con otra dentro de una frase o palabra. La función devuelve la frase original con todas las apariciones de la cadena a buscar reemplazadas con una cadena de reemplazo especificada.
La sintaxis básica habitual para esta función es:
str_replace ("cadena a buscar", "cadena de reemplazo", $variableOFraseOriginal)


Veámoslo con un ejemplo para entenderla mejor. Escribe este código y guárdalo con un nombre de archivo como ejemplo1.php. A continuación, sube el fichero al servidor y visualiza el resultado.
<?php //Ejemplo funciones básicas aprenderaprogramar.com
$texto = "Donde dije digo digo Diego.";
echo str_replace("Diego", "recortes", $texto);
echo "<br />";
echo $texto;
?>


Como podemos observar, en la cadena de caracteres $texto, hemos sustituido la palabra o conjunto de caracteres "Diego" por "Recortes" y hemos devuelto el resultado sin modificar la variable de entrada.
Fíjate que en el código que hemos escrito no hemos reemplazado el valor de la variable $texto por un nuevo contenido. Unicamente hemos impreso por pantalla el resultado que nos devuelve la función. Si hubiéramos escrito lo siguiente sí hubiéramos cambiado el contenido de la variable: $texto = str_replace("Diego", "recortes", $texto);
La función permite pasar opcionalmente un parámetro adicional que permite saber a posteriori el número de reemplazos que se han realizado:
str_replace ("cadena a buscar", "cadena de reemplazo", $variableOFraseOriginal, $numReemplazos)


Veámoslo con un ejemplo para entenderlo mejor:
<?php //Ejemplo funciones básicas aprenderaprogramar.com
$texto = "El dijo: es tarde ahora, pero es mejor si hay tres";
echo str_replace("es", "**", $texto, $reemplazos );
echo '<br/>Se han realizado: '.$reemplazos. ' reemplazos<br/>';
echo $texto;
?>


El resultado esperado es: El dijo: ** tarde ahora, pero ** mejor si hay tr**, Se han realizado: 3 reemplazos, El dijo: es tarde ahora, pero es mejor si hay tres
Fíjate que se reemplaza la cadena "es" indistintamente según esté separada por espacios o dentro de una palabra. Si sólo quisiéramos reemplazar la cadena si está separada por espacios podríamos indicar los espacios dentro de la cadena: echo str_replace(" es ", " ** ", $texto, $reemplazos );
Aquí hemos indicado que se reemplace espacio-e-s-espacio con espacio-*-*-espacio.
Si fuera necesario establecer reglas complejas de reemplazo, por ejemplo “reemplazar todas las palabras que empiecen por a y terminen por a con otra palabra, tendríamos que usar lo que se denominan expresiones regulares, pero no vamos a estudiar ahora la forma de definir y emplear expresiones regulares con PHP.


FUNCIONES STRTOLOWER Y STRTOUPPER
Las funciones strtolower y strtoupper transforman una cadena de caracteres en la misma cadena en minúsculas o mayúsculas respectivamente. Escribe ahora este código y guárdalo con un nombre de archivo como ejemplo4.php. A continuación, sube el fichero al servidor y visualiza el resultado.
<?php //Ejemplo funciones básicas aprenderaprogramar.com
$cadena = "EstO eS UnA cadeNA de CARActeres";
echo strtolower($cadena);
echo "<br />";
echo strtoupper($cadena);
?>

Como vemos el comportamiento de las funciones es sencillo. Simplemente devuelven la cadena de caracteres pasada como argumento en minúsculas o mayúsculas respectivamente.
Ten en cuenta que muchas veces para realizar comparaciones o para almacenar datos será interesante uniformizar la información que se almacena. Por ejemplo, si se pide una ciudad, un usuario puede introducir Buenos Aires, otro Buenos aires, otro BUENOS AIRES. Si usamos estas funciones, podemos uniformizar y hacer que siempre se muestren o guarden de una misma manera, lo cual facilitará el trabajo posterior.


FUNCIÓN COUNT_CHARS Y SUBSTR_COUNT
La función count_chars sirve para contar el número de apariciones de un carácter en una cadena.
 La sintaxis a emplear es la siguiente:
count_chars ( $cadena, $opcModo)


$opcModo es un entero opcional. Si no se especifica vale 0 por defecto. Sus valores admitidos son:
0: se devolverá un array con el valor numérico ascii como índice y la frecuencia de cada carácter ascii como valor.
1: se devolverá un array con el valor numérico ascii como índice y la frecuencia de cada carácter que aparezca al menos una vez como valor.
2: se devolverá un array de caracteres que no aparecen en la cadena, con el valor numérico ascii como índice y la frecuencia de cada carácter ascii que no aparece como valor.
3: devuelve una cadena que contiene todos los caracteres únicos.
4: devuelve una cadena que contiene todos los caracteres no utilizados.

Nota: los códigos numéricos ascii van de 0 a 255 y no todos son visibles por pantalla.
Ejemplo:
<?php //Ejemplo count_chars aprenderaprogramar.com
$cadena = 'es jueves';
$miArray = count_chars ( $cadena, 1);
foreach ($miArray as $indiceNum => $veces) {
   echo 'Letra: '.chr($indiceNum).' , encontrada '.  $veces.' veces<br/>';
}
?>


El resultado esperado es: Letra: , encontrada 1 veces. Letra: e , encontrada 3 veces. Letra: j , encontrada 1 veces. Letra: s , encontrada 2 veces. Letra: u , encontrada 1 veces. Letra: v , encontrada 1 veces

Otra función útil es substr_count($cadena, $subcadena). Esta función nos devuelve el número de veces que aparece la subcadena dentro de la cadena. Por ejemplo:
<meta charset="utf-8">
<?php //Ejemplo curso PHP aprenderaprogramar.com
$cadena1 = 'Pedro Juan Luis Marco Luis Pedro Juan Luis Pedro';
$cadena2 = 'Luis';
echo 'Luis aparece '.substr_count($cadena1, $cadena2). ' veces'
?>

El resultado esperado es <<Luis aparece 3 veces>>


OTRAS FUNCIONES PARA CADENAS DE TEXTO
PHP define numerosas funciones nativas para el manejo de cadenas de texto. Vamos a ver algunas de ellas:
FUNCIÓN
UTILIDAD
EJEMPLOS aprenderaprogramar.com
strlen($cadena)
Devuelve la longitud o número de caracteres de la cadena
Ver entregas anteriores del curso
substr ($cadena, $inicio, $opcNumCar)
Si no se especifica $opcNumCar devuelve la subcadena entre la posición $inicio y el fin de cadena siendo la posición inicial la cero. Si se especifica $opcNumCar extrae $opcNumCar caracteres desde la posición $inicio (inclusive).
Ver entregas anteriores del curso
ucfirst($cadena);
Devuelve la cadena con la primera letra en mayúsculas
$saludo = "hoy es viernes";
ucfirst($saludo);
//Hoy es viernes
ucwords($cadena);
Devuelve la cadena con cada una de sus palabras con la primera letra en mayúsculas
$saludo = "hoy es viernes";
echo ucwords($saludo);
//Hoy Es Viernes
strpos ($cadena , $subCadena, $opcPosInicio )
Devuelve la posición en que comienza la subcadena a partir de la posición inicial (cero) si no se especifica $opcPosInicio, o a partir de la posición $opcPosInicio si se especifica. Si no se encuentra la subcadena devuelve false.
$saludo = "hoy es viernes";
echo strpos($saludo, "es");
//4
trim ($cadena, $opcCaracteres)
Si no se especifica $opcCaracteres, devuelve la cadena eliminando espacios en blanco, tabuladores, saltos de línea y retornos de carro del principio y final de la cadena. Si se especifica $opcCaracteres, se eliminan los caracteres especificados.
$saludo = "*** hoy es viernes ***";
echo trim($saludo, "*");
//hoy es viernes
Nota: puede no funcionar como se espera debido a juego de caracteres, configuración local y configuración del servidor.
ltrim ($cadena, $opcCaracteres)
Si no se especifica $opcCaracteres, devuelve la cadena eliminando espacios en blanco, tabuladores, saltos de línea y retornos de carro del principio de la cadena. Si se especifica $opcCaracteres, se eliminan los caracteres especificados.
$saludo = "*** hoy es viernes ***";
echo ltrim($saludo, "*");
//hoy es viernes ***
Nota: puede no funcionar como se espera debido a juego de caracteres, configuración local y configuración del servidor.
rtrim ($cadena, $opcCaracteres)
Si no se especifica $opcCaracteres, devuelve la cadena eliminando espacios en blanco, tabuladores, saltos de línea y retornos de carro del final de la cadena. Si se especifica $opcCaracteres, se eliminan los caracteres especificados.
$saludo = "*** hoy es viernes ***";
echo rtrim($saludo, "*");
//*** hoy es viernes
Nota: puede no funcionar como se espera debido a juego de caracteres, configuración local y configuración del servidor.
chop
Igual que rtrim
 
str_repeat($cadena, $numVeces)
Devuelve la cadena repetida $numVeces siendo éste un número entero.
$saludo = 'hola ';
str_repeat($saludo, 3);
//hola hola hola
strstr ($cadena, $desde, $opcBoolean)
Devuelve la subcadena desde la primera aparición de $desde (incluida) hasta el final si no se especifica opcBoolean ó este es false. Si $opcBoolean es true devuelve la subcadena desde el inicio hasta la primera aparición de $desde (excluida).
$saludo = "hoy es viernes";
echo strstr($saludo, "es", false);
//es viernes
strchr
Igual que strstr
 
chr ($ascii)
Devuelve el carácter correspondiente al código numérico entero $ascii según el código ascii
echo chr(65). ' es la salida';
// A es la salida

EJEMPLO FORMULARIO PHP

3. Formularios (III)

3.3 Ejemplo de formulario


Formulario en HTML

Veremos aquí un ejemplo en el que aplicaremos lo visto hasta ahora para recoger los datos de un formulario.
Lo primero es hacer un formulario en HTML. este es la página de nuestro formulario de ejemplo.

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Suscripción boletín</title> 
<style type="text/css">
h1 { text-align: center; }
td { padding: 0.2em 2em ; }
</style>

</head>
<body>
<h1>Suscripción electronica a nuestro boletín.</h1>
<p>Nota: Este es un formulario de ejemplo en el que los datos aquí escritos se 
trasladan a otra página.</p>
<form action="comprobar.php" method="post"/>

<p>Nombre: <input type="text" name="nombre"/>   
   Apellidos: <input type="text" name="apellidos" size="40"/>   
   e-mail: <input type="text" name="email" size="35"/></p>
<p>contraseña: <input type="password" name="contras"/><br/>
<table>
   <tr>
   <td>
   sexo<br/>
   <input type="radio" name="sexo" value="V"/> Varón<br/>
   <input type="radio" name="sexo" value="M"/> Mujer</p>
   </td>
   <td>
   Nivel de estudios<br/>
   <input type="radio" name="estudios" value="elemental" checked="checked">
     Certificado escolar<br/>
   <input type="radio" name="estudios" value="basico"/> 
     Graduado en E.S.O.<br/>
   <input type="radio" name="estudios" value="bachiller"/> 
     Bachiller - Formación Profesional <br/>
   <input type="radio" name="estudios" value="Diplomado"/> 
     Diplomado<br/>
   <input type="radio" name="estudios" value="licenciado"/> 
     Licenciado o Doctorado<br/>
   </td>
   <td>
   Interesado en los siguientes temas: <br/>
   <input type="checkbox" name="musica"/> Música<br/>
   <input type="checkbox" name="deportes"/> Deportes<br/>
   <input type="checkbox" name="cine"/> Cine<br/>
   <input type="checkbox" name="libros"/> Libros<br/>
   <input type="checkbox" name="ciencia"/> Ciencia</p>
   </td>
   </tr>
</table>
<p>Día de la semana que le interesa recibirlo:</p>
<select name="dia">
    <option>día de la semana:</option> 
    <option value="">lunes</option> 
    <option value="Martes">martes</option> 
    <option value="Miércoles">miercoles</option> 
    <option value="Jueves">jueves</option> 
    <option value="Viernes">viernes</option> 
    <option value="Sábado">sábado</option> 
    <option value="Domingo">domingo</option> 
</select>
</p>
<p>Su opinión: <br/>
<textarea name="comentario" rows="5" cols="50">Comentario: </textarea>
<p><input type="submit" value="Comprobar el formulario"> 
   <input type="reset" value="borrar todo"></p>
</form>
</body>
</html>
En este formulario hemos querido incluir al menos un campo de cada tipo, para que se vean los resultados del traslado de datos.

Página de comprobación de datos

Los resultados los veremos en la página "comprobar.php" la cual la colocaremos en la misma carpeta que el archivo anterior (por supuesto dentro del directorio "XAMPP/htdocs").
Está será la página "comprobar.php".

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Comprobar datos</title> 

</head>
<body>
<h1>Tus Datos de suscripción: </h1>
<p>Estos son los datos que nos has enviado:</p>
<?php  
echo "Nombre: "; echo $_POST['nombre']; echo "<br/>";
echo "apellidos: "; echo $_POST['apellidos']; echo "<br/>";
echo "E-mail: "; echo $_POST['email']; echo "<br/>";
echo "contraseña: "; echo $_POST['contras']; echo "<br/>";
echo "Sexo: "; echo $_POST['sexo']; echo "<br/>";
echo "Estudios: "; echo $_POST['estudios']; echo "<br/>";
echo "Aficiones: \"on\" seleccionado, sin marcar, no seleccionado<br/>";
echo "Musica: "; echo $_POST['musica']; echo "<br/>";
echo "Deportes: "; echo $_POST['deportes']; echo "<br/>";
echo "Cine: "; echo $_POST['cine']; echo "<br/>";
echo "Libros: "; echo $_POST['libros']; echo "<br/>";
echo "Ciencia: "; echo $_POST['ciencia']; echo "<br/><br/>";
echo "Día de la semana: "; echo $_POST['dia']; echo "<br/>";
echo "Tu comentario: "; echo $_POST['comentario']; echo "<br/>";
?>
<p>Comprueba tus datos antes de enviarlos, si no están bien vuelve a escribirlos.</p>
<p>Los datos son correctos: <a href="form.html">Enviar</a>
<p>Los datos no son correctos: <a href="enviar.html">Volver a escribirlos</a>

</body>
</html>

Pôr último colocaremos la página que nos dice que los datos han sido enviados, para ello crearemos la sigiente página llamada "enviar.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>comprobado</title> 
</head>
<body>
<h1>Tu solicitud ha sido admitida.</h1>
<p>Tus datos han sido registrados... </p>
</body>
</html>


Tomado de: http://aprende-web.net/php/php3_3.php

FORMULARIOS EN PHP

1. Introducción

Un formulario sencillo con dos campos a rellenar y un botón para enviar en HTML es de la siguiente forma:
<html>
<body>
<form action="formpost.php" method="post">
    Nombre: <input type="text" name="nombre"><br>
    Email: <input type="text" name="email"><br>
    <input type="submit" value="Enviar">
</form>
</body>
</html>
Cuando un usuario rellena los datos y hace click en enviar, los datos del formulario se envían para ser procesados al archivo formpost.php. Los datos se envían a través de HTTP con el método HTTP Post.
Una vez los datos están en formpost.php pueden mostrarse, guardarse en una base de datos o lo que se necesite. En formpost.php vamos a mostrarlos con echo:
<html>
<body>
Hola <?php echo $_POST["nombre"]; ?><br>
Tu email es: <?php echo $_POST["email"]; ?>
</body>
</html>
Lo mismo se puede conseguir con el método HTTP GET:
<html>
<body>
<form action="formget.php" method="get">
Nombre: <input type="text" name="nombre"><br>
Email: <input type="text" name="email"><br>
    <input type="submit" value="Enviar">
</form>
</body>
</html>
Ahora el archivo donde recibimos los datos es formget.php:
<html>
<body>
Hola <?php echo $_GET["nombre"]; ?><br>
Tu email es: <?php echo $_GET["email"]; ?>
</body>
</html>
Estos han sido dos ejemplos muy sencillos para ver el funcionamiento básico de un formulario. Siempre que se crean formularios hay que tener muy en cuenta la seguridad, y para ello se utiliza la validación de formularios.
Las superglobals $_GET y $_POST sirven para coleccionar datos de formularios, y vamos a ver las diferencias a continuación.

2. GET y POST

$_GET y $_POST son variables superglobales que forman arrays de keys y values, donde los keys son los nombres del formulario (atributo "name") y los values son los datos de entrada de los usuarios. El hecho de que sean superglobals hace que sean accesibles desde el script independientemente del ámbito.
$_GET es un array de variables que se pasan al script a través de los parámetros de URL. La información que se envía es visible para todo el mundo y tiene limitada la cantidad de información que se puede enviar a 2000 caracteres. Las URLs con los datos enviados pueden guardarse en marcadores, lo que puede ser útil en ciertos casos. $_GET sólo se emplea para el envío de información reducida y no sensible.
$_POST es un array de variables que se pasan al script a través del método HTTP POST. La información que se envía no es visible para los demás ya que los nombres y variables van embebidas en el body del HTTP request. No tiene límites en la cantidad de información a enviar. Soporta datos de entrada multi-part binary a la hora se subir archivos al servidor (lo que permite subir múltiples archivos a la vez).

3. Tipos de elementos

Los 10 tipos de elementos más importantes para los formularios HTML con PHP son:
ElementoDescripción
input type="text"Caja de texto
input type="password"Caja de texto donde se muestran asteriscos en lugar de los caracteres escritos
input type="checkbox"Cajas seleccionables que permite escoger múltiples opciones
input type="radio"Cajas seleccionables en grupos que sólo permiten escoger una opción
input type="submit"Botón para enviar el formulario
input type="file"Cajas de texto y botón que permite subir archivos
input type="hidden"Elemento escondido. Especialmente útil para tokens de seguridad
optionUna opción posible dentro de un elemento element
selectLista de opciones de elementos option
textareaTexto multilínea

4. Validación

La validación de formularios es algo fundamental ya que previene posibles ataques de intrusos, además de asegurar que los datos que se reciben son realmente del tipo deseado.
Existen dos formas de validación de formularios: en el lado del cliente y en el lado del servidor. En el lado del cliente la validación suele ser mediante JavaScript, es más rápida y evita enviar más trabajo al servidor. En el lado del servidor se emplea PHP para verificar que se envían valores correctos, es más seguro pero es más lento y da un poco de trabajo al servidor. En este artículo vamos a ver algún ejemplo de esta segunda forma.
El siguiente es un sencillo formulario algo más complejo con los siguiente datos: Nombre, Contraseña, Educacion, Nacionalidad, Idiomas, Email y Sitio web:
<h2>Formulario:</h2>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
    Nombre:
    <input type="text" name="nombre" maxlength="50"><br>
    Contraseña:
    <input type="password" name="password"><br>
    Educacion:
    <select name="educacion">
        <option value="sin-estudios">Sin estudios</option>
        <option value="educacion-obligatoria" selected="selected">Educación Obligatoria</option>
        <option value="formacion-profesional">Formación profesional</option>
        <option value="universidad">Universidad</option>
    </select> <br>
    Nacionalidad:
    <input type="radio" name="nacionalidad" value="hispana">Hispana</input>
    <input type="radio" name="nacionalidad" value="otra">Otra</input><br>
    Idiomas:
    <input type="checkbox" name="idiomas[]" value="español" checked="checked">Español</input>
    <input type="checkbox" name="idiomas[]" value="inglés">Inglés</input>
    <input type="checkbox" name="idiomas[]" value="francés">Francés</input>
    <input type="checkbox" name="idiomas[]" value="aleman">Alemán</input><br>
    Email:
    <input type="text" name="email"><br>
    Sitio Web:
    <input type="text" name="sitioweb"><br>
    // Botón de enviar
    <input type="submit" name="submit" value="Enviar">
</form>
</body>
</html>
Vamos a ver los aspectos más característicos:
  • El atributo maxlength limita el número de caracteres para una caja de texto.
  • Contraseña es del tipo password, lo que permite ocultar los caracteres con * cuando se escribe.
  • Educación es un elemento select, que permite seleccionar optionsen una lista. El texto en el atributo value es el que se enviará a través del formulario. El atributo selected permite mostrar el seleccionado por defecto.
  • Nacionalidad es del tipo radio, los elementos radio del mismo grupo han de tener un único atributo name y sólo se puede seleccionar uno.
  • Los idiomas están en un elemento checkbox, que permite enviar varios datos en forma de array si se indica en el atributo name con corchetes. Se puede añadir un atributo checked como seleccionado por defecto.
  • En action se ha puesto _<?php echo htmlespecialchars($_SERVER["PHPSELF"]); ?>. $_SERVER["PHP_SELF"] es una superglobal que devuelve el nombre del archivo en el que se encuentra el formulario, lo que hace que los datos se envíen al mismo archivo, en lugar de llevarlos a otro archivo para tratarlos. Si se emplea esta forma de indicar el archivo para action, es necesario usar la función htmlespecialchars(), que convierte caracteres especiales en entidades HTML previniendo posibles ataques Cross-site Scripting.
En este ejemplo todas las acciones de validar, enviar y recibir datos se hacen en el mismo archivo form.php.
Primero vamos a crear un filtrado común para todos los campos con la función filtrado():
function filtrado($datos){
    $datos = trim($datos); // Elimina espacios antes y después de los datos
    $datos = stripslashes($datos); // Elimina backslashes \
    $datos = htmlspecialchars($datos); // Traduce caracteres especiales en entidades HTML
    return $datos;
}
Esta función se aplicaría a cada campo a la hora de recibir los datos:
if(isset($_POST["submit"]) && $_SERVER["REQUEST_METHOD"] == "POST"){
    $nombre = filtrado($_POST["nombre"]);
    $password = filtrado($_POST["password"]);
    $educacion = filtrado($_POST["educacion"]);
    $nacionalidad = filtrado($_POST["nacionalidad"]);
    // Utilizamos implode para pasar el array a string
    $idiomas = filtrado(implode(", ", $_POST["idiomas"]));
    $email = filtrado($_POST["email"]);
    $sitioweb = filtrado($_POST["sitioweb"]);
}
Para aceptar los datos se ha puesto _isset($POST["submit"]), que crea la key submit cuando se hace click en el botón, y _$_SERVER["REQUESTMETHOD"] == "post", que especifica que el método request ha de ser POST. Se puede usar una de las dos formas o las dos a la vez.
Para mostrar los datos:
<?php if(isset($_POST["submit"])): ?>
<h2>Mostrar datos enviados</h2>
Nombre : <?php isset($nombre) ? print $nombre : ""; ?> <br>
Contraseña : <?php isset($password) ? print $password : ""; ?> <br>
Educación : <?php isset($educacion) ? print $educacion : ""; ?> <br>
Nacionalidad : <?php isset($nacionalidad) ? print $nacionalidad : "";?> <br>
Idiomas : <?php isset($idiomas) ? print $idiomas : ""; ?> <br>
Email : <?php isset($email) ? print $email : ""; ?> <br>
Sitio web : <?php isset($sitioweb) ? print $sitioweb : ""; ?> <br>
<?php endif; ?>
Todos los campos anteriores son opcionales. La validación más básica consiste en exigir que se rellene un campo, y comprobaremos también que el email tiene un formato de email, que el sitio web es una URL correcta y que password tiene un mínimo de 5 caracteres. Las validaciones de formatos pueden realizarse mediante expresiones regulares o con filtros. Siempre que sea posible, es mejor utilizar los filtros de PHP.
if(isset($_POST["submit"]) && $_SERVER["REQUEST_METHOD"] == "POST"){
    // El nombre y contraseña son campos obligatorios
    if(empty($_POST["nombre"])){
        $errores[] = "El nombre es requerido";
    }
    if(empty($_POST["password"]) || strlen($_POST["password"]) < 5){
        $errores[] = "La contraseña es requerida y ha de ser mayor a 5 caracteres";
    }
    // El email es obligatorio y ha de tener formato adecuado
    if(!filter_var($_POST["email"], FILTER_VALIDATE_EMAIL) || empty($_POST["email"])){
        $errores[] = "No se ha indicado email o el formato no es correcto";
    }
    // El sitio web es obligatorio y ha de tener formato adecuado
    if(!filter_var($_POST["sitioweb"], FILTER_VALIDATE_URL) || empty($_POST["sitioweb"])){
        $errores[] = "No se ha indicado sitio web o el formato no es correcto";
    }
    // Si el array $errores está vacío, se aceptan los datos y se asignan a variables
    if(empty($errores)) {
        $nombre = filtrado($_POST["nombre"]);
        $password = filtrado($_POST["password"]);
        $educacion = filtrado($_POST["educacion"]);
        $nacionalidad = filtrado($_POST["nacionalidad"]);
        // Utilizamos implode para pasar el array a string
        $idiomas = filtrado(implode(", ", $_POST["idiomas"]));
        $email = filtrado($_POST["email"]);
        $sitioweb = filtrado($_POST["sitioweb"]);
    }
}
El array de errores $errores guarda cada uno de los errores que se registran para luego mostrarlos. Si el array tiene algún elemento, el formulario no será aceptado. Para mostrarlos podemos hacerlo así:
<ul>
<?php if(isset($errores)){
    foreach ($errores as $error){
        echo "<li> $error </li>";
    }
}
?>
</ul>

5. Subida de archivos

Lo más laborioso a la hora de hacer un formulario que permita la subida de archivos es manejarlos y organizarlos una vez están en el servidor. Inicialmente los archivos se suben a un directorio temporal y luego se relocalizan.
Configuración en PHP para la subida de archivos:
  • Debe estar On la variable file_uploads en php.ini.
  • En php.ini también se encuentra la variable upload_tmp_dir, que indica el directorio donde se dirigirán los archivos cuando se suban. El tamaño máximo viene indicado en el mismo archivo de configuración por upload_max_filesize. Para ver estos valores se puede utilizar ini_get('upload_tmp_dir') e ini_get('upload_max_filesize'). upload_tmp_dir sólo es manipulable desde el php.ini o httpf.conf, upload_max_filesize puede también desde .htaccess o un user.ini (tienen modo PHP_INI_SYSTEM y PHP_INI_PERDIR respectivamente).
  • Es necesario que los permisos tanto del directorio temporal como del directorio final sean de escritura.
  • Para que un formulario tenga la capacidad de aceptar archivos se añade el atributo enctype="multipart/form-data" al elemento form.
De nuevo en este ejemplo pondremos todo el contenido en un archivo form2.php:
<h2>Formulario subida de archivos</h2>
<html>
<body>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>" />
    <input type="file" name="imagen" />
    <input type="submit" name="submit" />
</form>
</body>
</html>
Se incluye un input del tipo hidden que limita el tamaño máximo del archivo que se puede subir (en bytes).
La información sobre un archivo subido la proporciona el array multidimensional $_FILES. Este array se crea con el key que se indique en el input del formulario, en este caso "imagen":
  • $_FILES["imagen"]["name"]. Guarda el nombre original del archivo del cliente.
  • $_FILES["imagen"]["type"]. Guarda el MIME type del archivo.
  • $_FILES["imagen"]["size"]. Guarda el tamaño del archivo en bytes.
  • $_FILES["imagen"]["tmp_name"]. Guarda el nombre del archivo temporal.
  • $_FILES["imagen"]["error"]. Guarda cualquier código de error que pueda provocar la subida del archivo.
La función move_uploaded_file() mueve un archivo subido del directorio temporal al directorio que se indique.
$directorioSubida = "uploads/";
$max_file_size = "51200";
$extensionesValidas = array("jpg", "png", "gif");
if(isset($_POST["submit"]) && isset($_FILES['imagen'])){
    $errores = array();
    $nombreArchivo = $_FILES['imagen']['name'];
    $filesize = $_FILES['imagen']['size'];
    $directorioTemp = $_FILES['imagen']['tmp_name'];
    $tipoArchivo = $_FILES['imagen']['type'];
    $arrayArchivo = pathinfo($nombreArchivo);
    $extension = $arrayArchivo['extension'];
    // Comprobamos la extensión del archivo
    if(!in_array($extension, $extensionesValidas)){
        $errores[] = "La extensión del archivo no es válida o no se ha subido ningún archivo";
    }
    // Comprobamos el tamaño del archivo
    if($filesize > $max_file_size){
        $errores[] = "La imagen debe de tener un tamaño inferior a 50 kb";
    }
    // Comprobamos y renombramos el nombre del archivo
    $nombreArchivo = $arrayArchivo['filename'];
    $nombreArchivo = preg_replace("/[^A-Z0-9._-]/i", "_", $nombreArchivo);
    $nombreArchivo = $nombreArchivo . rand(1, 100);
    // Desplazamos el archivo si no hay errores
    if(empty($errores)){
        $nombreCompleto = $directorioSubida.$nombreArchivo.".".$extension;
        move_uploaded_file($directorioTemp, $nombreCompleto);
        print "El archivo se ha subido correctamente";
    }
}
El array $_FILES['imagen']['error'] especifica por qué no se ha podido subir el archivo, lo que permite especificar un mensaje de vuelta para cada tipo de error. Devuelve un integer con el número de error:
ErrorValorSignificado
UPLOAD_ERR_OK0No hay errores
UPLOAD_ERR_INI_SIZE1Supera el tamaño máximo indicado en php.ini
UPLOAD_ERR_FORM_SIZE2Supera el tamaño máximo indicado en MAX_FILE_SIZE de html
UPLOAD_ERR_PARTIAL3Sólo se ha subido el archivo parcialmente
UPLOAD_ERR_NO_FILE4No se ha subido ningún archivo
UPLOAD_ERR_NO_TMP_DIR6Falta la carpeta temporal
UPLOAD_ERR_CANT_WRITE7No se puede escribir en el directorio especificado
UPLOAD_ERR_EXTENSION8Una extensión de PHP ha detenido la subida

6. Subida múltiple de archivos

Una subida múltiple de archivos en PHP en la práctica se hace normalmente con ayuda de JavaScript. Una buena librería para subir archivos es DropzoneJS.
En el formulario HTML lo único que cambia es que se añade un atributo multiple y que en el atributo name del input file se añade corchetes para indicar que es un array:
<input type="file" name="imagenes[]" multiple="multiple" />
En cuanto al backend, omitiendo validaciones esta puede ser una forma de hacerlo:
$directorioSubida = "uploads/";
$max_file_size = "51200";
if(isset($_POST["submit"]) && isset($_FILES['imagenes'])){
    $nombres = $_FILES['imagenes']['name'];
    $temporales = $_FILES['imagenes']['tmp_name'];
    $tipos = $_FILES['imagenes']['type'];
    $errores = $_FILES['imagenes']['error'];
    // Iteramos sobre los arrays creados
    for ($i = 0; $i < count($temporales); $i++){
        if(move_uploaded_file($temporales[$i], $directorioSubida.$nombres[$i])){
            echo "Se ha subido {$nombres[$i]} correctamente <br>";
        } else {
            echo "Ha habido algún error al subir algún archivo";
        }
    }
}



Tomado de= https://diego.com.es/formularios-en-php