ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
Formularios
La verdadera potencia del lenguaje reside en la aplicación de las técnicas aprendidas
a través de varias páginas Web, pasando información de unas a otras.
▪ Argumentos GET
Los argumentos GET pasan la información como parte de la URL. Cuando se utilice
esta forma de trabajar, las parejas de variable / valor podrán verse en la casilla de
dirección del navegador.
Ejemplo:
[Link]?variable1=Hola Mundo&variable2 = 1234
El array $_GET es considerado en PHP una variable súper-global. Ésta almacena
todas las variables pasadas entre páginas mediante el método GET. Para extraer el
valor de una variable pasada por este método sólo hay que escribir $_GET
["nombre_variable"] en la página que recibe los datos.
▪ Formularios con GET
La forma más utilizada para recoger información acerca de los usuarios es utilizar
formularios HTML. El siguiente código muestra cómo recoger información:
Ejemplo form_GET.php:
<h1>Introduzca sus datos personales: </h1>
<form action="form_GET2.php" name="form1" method="get"
enctype="multipart/form-data" >
<table width="30%" cellspacing="10">
<tr>
<td>Nombre</td>
<td><input type="text" name="nombre" id="nombre" required /></td>
</tr>
<tr>
<td>Apellidos</td>
<td><input type="text" name="apellidos" id="apellidos" required
/></td>
</tr>
<tr>
<td>Correo</td>
<td><input type="email" name="correo" id="correo" required /></td>
</tr>
<tr>
<td>Estado civil</td>
<td>
<select name="estado" id="estado">
<option value="Soltero" selected>Soltero</option>
<option value="Casado">Casado</option>
<option value="Divorciado">Divorciado</option>
<option value="Viudo">Viudo</option>
</select>
</td>
</tr>
<tr>
1
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
<td>Número de hijos:</td>
<td>
<input type="radio" name="hijos" value="0" checked /> 0
<input type="radio" name="hijos" value="l" /> 1
<input type="radio" name="hijos" value="2" /> 2
<input type="radio" name="hijos" value="3" /> 3
</td>
</tr>
<tr>
<td>Estas interesado en...</td>
<td>
<input type="checkbox" name="intereses[]" value="Informatica" />
Informática<br/>
<input type="checkbox" name="intereses[]" value="Buceo" />
Buceo<br/>
<input type="checkbox" name="intereses[]" value="Magia" />
Magia<br/>
<input type="checkbox" name="intereses[]" value="Jazz" />
Jazz<br/>
</td>
</tr>
<tr>
<td><input type="submit" name="enviar" value="Registrar" /></td>
<td><input type="reset" name="borrar" value="Cancelar" /></td>
</tr>
</table>
</form>
El atributo action de la etiqueta <form> contiene la página web a la que se enviarán
los datos y el atributo method permite seleccionar el método de envío; por ahora,
utilizaremos el método GET. La página form_GET2.php recoge la información del
formulario y la imprime en pantalla utilizando un bucle foreach a la variable súper-
global $_GET.
Ejemplo form_GET2.php:
<?php
//PRIMERA PARTE
echo "<h3>Salida de datos mediante un recorrido foreach:</h3>";
foreach ($_GET as $indice => $valor){
if($indice == "enviar"){
continue;
}
elseif(is_array($valor)){
echo "<ul type='square'>";
foreach ($valor as $valor2){
echo "<li>$valor2</li>";
}
echo "</ul>";
}
else{
echo "$indice: $valor<br/>";
}
}
2
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
//SEGUNDA PARTE
echo "<h3>Salida de datos mediante llamadas a variables:</h3>";
echo "Nombre: ".$_GET["nombre"]."<br/>";
echo "Apellidos: ".$_GET["apellidos"]."<br/>";
echo "Correo: ".$_GET["correo"]."<br/>";
echo "Estado: ".$_GET["estado"]."<br/>";
echo "Hijos: ".$_GET["hijos"]."<br/>";
if(isset($_GET["intereses"])){
echo "<h4>Tus intereses son:</h4>";
echo "<ul type='square'>";
foreach ($_GET["intereses"] as $indice => $valor){
echo "<li>$valor</li>";
}
echo "</ul>";
}
else{
echo "<h4>No has seleccionado ningún interés</h4>";
}
?>
En la primera parte del script hemos utilizado un recorrido que extrae todos los valores
dentro de $_GET.
En la segunda parte del script se imprimen los datos uno a uno, para ello hemos de
saber el name de las variables definidas en el formulario anterior.
Existen en el formulario varias técnicas de recogida de información. Los cuadros de
texto, que permiten escribir valores alfanuméricos, lista de selección y botones de
opción, en dónde podemos elegir una de las opciones existentes y casillas de
verificación que permiten elegir 0 o más opciones existentes. Todas estas partes del
formulario tienen una variable asociada que puede buscarse en $_GET.
Los métodos que plantean un problema son los que permiten la recogida de varios
valores, como las casillas de verificación y los campos de selección múltiple. Al poder
elegir varias opciones, éstas son enviadas como un array.
Para que los valores sean enviados como array hay que declararlas en el formulario
como tal, escribiendo dos símbolos de corchetes en la propiedad name asociado al
campo. Por ejemplo:
<input type=”checkbox” name="intereses[]" value="Informatica"/>
En el script anterior podemos ver como se realiza un recorrido para extraer los valores
enviados del array de las casillas de verificación.
3
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
▪ Paso de información con GET
Si observáis la barra de dirección de los navegadores cuando visitáis páginas web
sobre noticias o carritos de la compra, en la URL van apareciendo variables que tienen
que ver con los distintos menús que existen en la web. El siguiente ejemplo muestra
una pequeña revista digital escrita en pocas líneas y en una sola página web que
cambia sus noticias eligiendo las distintas opciones del menú.
Ejemplo form_Revista.php:
<?php
$menu=[1 => "Cultura", 2 => "Deportes", 3 => "Sociedad", 4 =>
"Internacional"];
echo "<h3>Revista Digital</h3>";
foreach($menu as $indice => $valor) {
echo "<a
href=".$_SERVER['PHP_SELF']."?menu=$indice>$valor</a><br/>";
}
if(isset($_GET["menu"])){
echo "<h4>NOTICIAS</h4>";
switch($_GET["menu"]){
case 1:
echo "Cultura";
break;
case 2:
echo "Deportes";
break;
case 3:
echo "Sociedad";
break;
case 4:
echo "Internacional";
break;
default:
echo "Noticias de Portada";
break;
}
}
else{
echo "<h4>Selecciona una opción</h4>";
}
?>
En el array $menu se cargan los distintos valores que podemos ir seleccionando. En
la actualidad estos valores se suelen extraer de una base de datos. Para mostrar el
menú se hace un bucle donde se extraen todos los valores e índices del array y se
ponen como valores en los enlaces.
Los enlaces siempre se dirigen a la página principal, pero con un valor distinto en la
variable menú. La segunda parte del script es una elección múltiple mediante la
estructura switch(), donde en función del valor de la variable menú pasada por GET,
se eligen unas noticias u otras.
4
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
▪ Argumentos POST
La utilización del método GET es totalmente insegura, porque no hay forma de ocultar
datos privados en la dirección web, tales como la contraseña de entrada o el número
de cuenta bancaria. El método POST arregla estos problemas. Este método es tan
sencillo como cambiar en el formulario el método de envío de datos:
Ejemplo form_POST.php:
<form action="form_POST2.php" name="form2" method="post"
enctype="multipart/form-data">
En cuanto a la recuperación de los datos, también se debe cambiar el nombre de la
variable súper-global $_GET por $_POST de esta manera:
Ejemplo form_POST2.php:
<?php
//PRIMERA PARTE
echo "<h3>Salida de datos mediante un recorrido foreach:</h3>";
foreach ($_POST as $indice => $valor){
if($indice == "enviar"){
continue;
}
elseif(is_array($valor)){
echo "<ul type='square'>";
foreach ($valor as $valor2){
echo "<li>$valor2</li>";
}
echo "</ul>";
}
else{
echo "$indice: $valor<br/>";
}
}
//SEGUNDA PARTE
echo "<h3>Salida de datos mediante llamadas a variables:</h3>";
echo "Nombre: ".$_POST["nombre"]."<br/>";
echo "Apellidos: ".$_POST["apellidos"]."<br/>";
echo "Correo: ".$_POST["correo"]."<br/>";
echo "Estado: ".$_POST["estado"]."<br/>";
echo "Hijos: ".$_POST["hijos"]."<br/>";
if(isset($_POST["intereses"])){
echo "<h4>Tus intereses son:</h4>";
echo "<ul type='square'>";
foreach ($_POST["intereses"] as $indice => $valor){
echo "<li>$valor</li>";
}
echo "</ul>";
}
else{
echo "<h4>No has seleccionado ningún interés</h4>";
}
?>
5
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
▪ Envío de archivos $_FILES
Los campos de tipo file permiten el envío de archivos a través de formularios. La
variable súper-global $_FILES recoge mediante una matriz los ficheros enviados.
Importante: PHP no reconoce ni procesa ficheros que hayan sido enviados
mediante GET. Cuando use un formulario desde el cual el usuario pueda enviar
ficheros al servidor, se tendrá que usar siempre el método POST.
El diseño de un formulario que permita el envío de ficheros exige el incluir en el mismo
un campo de tipo file e incluir en el comando de definición del formulario el parámetro
ENCTYPE indicando al formulario que se transferirán datos en archivos.
Además al formulario debemos añadirle un campo oculto de nombre MAX_FILE_SIZE,
al cual le daremos el valor en bytes del tamaño máximo del archivo a descargar.
<form action=”[Link]” method=”post” enctype=”multipart/form-
data” >
<input type=”hidden” name=”MAX_FILE_SIZE” value=”100000”>
<input type =”file” name=”archivo”>
<input type =”submit” name=”enviar” value=”Enviar archivo”>
</form>
Cuando el formulario es enviado, PHP detectará automáticamente que se está
descargando un archivo y lo colocará en un directorio temporal en el servidor. Dicho
directorio será el que esté indicado en el archivo de configuración [Link], o en su
defecto en el directorio temporal del sistema.
Cuando PHP detecta que se está descargando un archivo crea varias variables con el
prefijo del nombre del archivo pero con distintas terminaciones.
▪ $_FILES['archivo']['error']
▪ $_FILES['archivo']['name']
▪ $_FILES['archivo']['tmp_name']
▪ $_FILES['archivo']['type']
▪ $_FILES['archivo']['size']
Si el proceso de descarga no ha sido correcto la variable archivo tomará el valor none
y size será 0, y si el proceso ha sido correcto, pero la variable
$_FILES['archivo']['size'] da 0, quiere decir que el archivo a descargar supera el
tamaño máximo indicado por MAX_FILE_SIZE.
Una vez descargado el archivo, lo primero que debemos hacer es moverlo a otro lugar,
ya que si no se hace nada con él, cuando acabe la ejecución de la página se borrará.
Las arrays que manejan los ficheros son asociativas de dos índices. El primero (el de
las filas) contiene el nombre que se ha dado en el formulario a cada campo de fichero
(puede haber más de uno en un mismo formulario). Dentro de cada fila encontramos
otro índice con las propiedades del fichero, como el nombre, tamaño, tipo…
6
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
Las propiedades que definen un archivo enviado al servidor son las siguientes:
PROPIEDAD CONTENIDO
error Indica si se ha producido un error en el envío del fichero. Si
todo ha ido correctamente, esta propiedad almacena el valor
0. Si se ha producido un error, el valor será diferente de 0.
name El nombre del archivo, tal como lo tiene almacenado el
usuario en su ordenador.
tmp_name Es un nombre temporal que usa PHP para la gestión
provisional del archivo, hasta que lo almacene en el disco del
servidor, lo envíe por correo electrónico a donde
corresponda, o cualquier otra acción que le hayamos
programado al script.
type Almacena el tipo de fichero que se ha enviado. Puede ser
una imagen, audio, vídeo, texto plano, etc.
size El peso del archivo en bytes.
Ejemplo form_Fichero1.php:
<body>
<?php
if(isset($_POST['enviar'])){
foreach ($_FILES["fichero"] as $indice => $valor){
echo "Propiedad: $indice ---- Valor: $valor<br/>";
}
}
else{
?>
<h3>Selecciona el fichero:</h3>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"
method="post" name="form1" id="form1" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="300000"/>
<input type="file" name="fichero" id="fichero"/>
<input type="submit" value="ENVIAR" name="enviar" id="enviar"/>
</form>
<?php
}
?>
</body>
En este script se emplea un bucle foreach para recorrer cada uno de los elementos del
array que, a su vez, es el elemento “fichero” del array $_FILES.
7
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
Ejemplo form_Ficheros.php:
<?php
if(isset($_POST['enviar'])){
if($_FILES['archivo']['name'] != "" && $_FILES['archivo']['size'] !=
0){
echo "Nombre: ". $_FILES['archivo']['name']."<br/>";
echo "Tamaño: ". $_FILES['archivo']['size']." bytes <br/>";
echo "Fich. Tmp.: ".$_FILES['archivo']['tmp_name']."<br/>";
echo "Tipo: ". $_FILES['archivo']['type']."<br/>";
echo "Error: ". $_FILES['archivo']['error']."<br/>";
if(!is_dir("descarga/")){//Comprueba si existe el directorio
mkdir("descarga/", 0700); //Crea el directorio
}
$carpetaDestino="descarga/".$_FILES['archivo']['name'];
if(move_uploaded_file($_FILES['archivo']['tmp_name'],
$carpetaDestino)){
echo "<h2>El archivo se ha copiado a la carpeta de destino</h2>";
}else{
echo "<h2>No se ha podido copiar el archivo a la carpeta de
destino</h2>";
}
$tipo=$_FILES['archivo']['type'];
$barra=strpos($tipo, "/");
$cadena_extraida=substr($tipo,0,$barra);
$extension="image";
if (strcmp($extension,$cadena_extraida) == 0){
echo "<img src='$carpetaDestino' width='200' height='200'/>";
}
}elseif($_FILES['archivo']['name'] != "" && $_FILES['archivo']['size']
== 0){
echo "<h2>El tamaño del archivo es superior al máximo</h2>";
}else{
echo "<h2>No ha elegido un archivo para mover</h2>";
}
}//Fin de isset
else{
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"
method="post" enctype="multipart/form-data" name="form1">
<h3>Archivo a descargar</h3>
<input type="hidden" name="MAX_FILE_SIZE" value="150000"/>
<input type="file" name="archivo" size="35"/>
<input type="submit" name="enviar" value="Aceptar"/>
</form>
<?php
}
?>
8
ASIX – Módulo 9 UF 1: Lenguaje de guión de servidor
En este script se recoge un archivo del formulario y se muestra los datos del archivo
por pantalla, si el tamaño supera el máximo mostrará un error, si no se carga ningún
archivo también mostrará un error, si la carga del archivo se realiza con éxito y no se
supera el tamaño se mostrarán los datos del archivo y en caso de que sea una
imagen, se mostrará la imagen. Se puede observar una nueva función llamada
move_uploaded_file(), esta función se encarga de mover un archivo cargado a una
nueva ubicación.
bool move_uploaded_file (string $nombre_archivo , string $destino)
Realiza un chequeo para asegurar que el archivo indicado por nombre_archivo sea
un archivo cargado válido. Si el archivo es válido, será movido al nombre de archivo
dado por destino.
nombre_archivo - El nombre del archivo cargado.
Destino - El destino del archivo a mover.
▪ Si nombre_archivo no es un archivo cargado válido, entonces no se tomará
ninguna acción, y move_uploaded_file() devolverá FALSE.
▪ Si nombre_archivo es un archivo cargado válido, pero no puede ser movido
por alguna razón, no se tomará ninguna acción, y move_uploaded_file()
devolverá FALSE.
▪ Si el archivo de destino ya existe será sobrescrito.
▪ Variables súper-globales
Las arrays súper-globales sirven para almacenar los valores que se pasan de unas
páginas a otras, se almacenan en el ordenador del usuario o en el servidor. En PHP 5
el uso de estas variables se hace obligatorio para recuperar todos los valores. Las
variables a utilizar son:
▪ $_GET: Almacena las variables pasadas por GET de un formulario.
▪ $_POST: Almacena las variables pasadas por POST de un formulario.
▪ $_COOKIE: Guarda los valores que están almacenados en cookies.
▪ $_SESSlON: Guarda las variables que se pasan entre sesiones.
▪ $_SERVER: Contiene numerosos valores relativos al servidor.
▪ $_FILES: Almacena los archivos que enviemos a través de un formulario.