Transmitir datos de una página a otra
Las variables superglobales
1. $GLOBALS
En el capítulo Funciones y estructuras de control - Las funciones, hemos visto que hay variables locales y globales. Estas variables tienen un alcance determinado dependiendo de dónde se declaran.
En PHP existe la tabla $GLOBALS o "superglobal" que contiene valores válidos, sea cual sea su alcance, es decir, en cualquier ubicación de la página PHP. Esta tabla tiene como índice el nombre de las variables, y como valor, el valor de las variables.
Por ejemplo:
<?php
$nombre = "Juan";
$apellido = "Gómez";
function concatena() {
$GLOBALS['nombre'] = $GLOBALS['nombre'] . " " . $GLOBALS['apellido'];
}
concatena(); //concatena el nombre y el apellido
echo $nombre;
?>
Da como resultado:
Juan Gómez |
Si ha escrito en la función $nombre = $nombre . " " . $apellido; PHP generará un error debido a que estas variables no tienen el alcance necesario para que la función las pueda conocer.
Puede pensar que resulta más sencillo declarar solo las variables superglobales, pero no es así. Esto evita muchas confusiones a la hora de declarar las variables en modo local y sobre todo ahorra mucha memoria si muchos usuarios visitan su sitio Web de manera simultánea; cada variable $GLOBALS ocupará memoria en su servidor y correrá el riesgo de saturarse. Si utiliza variables locales, PHP liberará la memoria que ya no se utiliza.
Más adelante veremos que existen otras variables superglobales. Se escriben siempre con mayúsculas, en forma de tabla y son válidas en todas las páginas PHP.
2. $_SERVER
$_SERVER es una tabla que se crea automáticamente y que contiene información, como rutas del script, encabezamientos, etc.
Veamos parte de la información más útil:
-
$_SERVER[’REMOTE_ADDR’]: permite conocer la dirección IP del usuario que ha solicitado la página.
Por ejemplo:
<?php
echo $_SERVER['REMOTE_ADDR'];
?>
Da como resultado:
127.0.0.1 |
Si está trabajando con su equipo y su servidor Web crea la dirección http://127.0.0.1 y está ejecutando esta página PHP, $_SERVER[’REMOTE_ADDR’] reenvía...
El método GET
1. Utilización del método GET
Por ahora ha llamado a sus páginas PHP con la siguiente URL: http://127.0.0.1/prueba.php
Cuando instala su página PHP en su servidor web después de comprar un nombre de dominio, como www.sitio.es, obtendrá lo siguiente: http://www.sitio.es/prueba.php
Si pasa de una página PHP a otra, se pierde toda la información de la primera página. Para guardar esta información, puede transmitirla a la URL que llama a la segunda página PHP.
Los valores se pasan a la URL de la siguiente manera: http://127.0.0.1/prueba.php?apellido=Gómez&nombre=Juan
Añada el signo de interrogación después del nombre de la página PHP, el nombre de la variable, el símbolo = y su valor. Para añadir otras variables con sus valores, añada el símbolo &, el nombre de la variable, el símbolo =, su valor, etc.
Por ejemplo: http://127.0.0.1/prueba.php?var1=fresa&var2=frambuesa&var3= plátano&var4=arándano
No se recomienda tener más de 256 caracteres en la URL; por lo tanto, este método tiene sus limitaciones.
En el siguiente ejemplo, se crean dos páginas PHP, get_envia.php y get_recibe.php para transmitir los datos de una página a otra.
El código de la página get_envia.php es:
<!DOCTYPE html>
<html lang="es">
<head>
<title>Ejercicio con GET</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body>
<p><a href="get_recibe.php?apellido=Gómez&nombre=Juan">llama la
página get_recibe.php?apellido=Gómez&nombre=Juan</a></p>
</body>
</html>
Esta página contiene un enlace que llama la página get_recibe.php con los valores apellido y nombre, así como sus respectivos valores.
Para recuperar el valor de estas variables, se utiliza la tabla asociativa $_GET.
Esta tabla tiene el nombre de las variables pasadas en la URL, y como valor el valor de estas variables que se pasanen la URL.
El código de la página get_recibe.php es:
<!DOCTYPE html>
<html lang="es"> ...
El método POST
1. Utilización del método POST
El método POST transmite datos de una página PHP a otra. A diferencia del método GET, estos datos no están visibles en la URL. De ahí que este método sea el más utilizado.
Todos los datos que están contenidos en un formulario se envían a la otra página PHP a través del método POST y se reciben en una tabla superglobal $_POST.
Para entenderlo mejor, vamos a crear una página PHP con el nombre formulario.php que contiene un formulario con el nombre y el apellido.
El código de la página formulario.php es:
<!DOCTYPE html>
<html lang="es">
<head>
<title>Ejercicio con POST</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf8" />
</head>
<body>
<form action="recibe_post.php" method="POST" name="formulario">
<h2>Formulario para enviar el nombre y los apellidos</h2>
Nombre: <input type="text" name="nombre" /><br />
Apellido: <input type="text" name="apellido" /><br />
<input type="submit" name="enviar" value="Enviar" />
</form>
</body>
</html>
Observe que en la etiqueta <form> está el atributo method con el valor POST, que es obligatorio para transmitir los valores que se han introducido en el formulario. Si escribe method=GET, los datos que se han introducido se transmiten a la URL.
A continuación, la etiqueta <form> debe contener la acción, es decir, el nombre de la página PHP al que se llama cuando hace clic en enviar (que es de tipo submit).
Cuando hace clic en enviar, todos los valores de los objetos que están en el formulario se envían a la página recibe_post.php, que los recibe en la tabla $_POST.
El código de la página recibe_post.php es:
<!DOCTYPE html>
<html lang="es">
<head>
<title>Ejercicio con POST</title>
<meta http-equiv="Content-Type" content="text/html; ...
El método $_REQUEST
$_REQUEST es una tabla asociativa que reagrupa los métodos $_GET, $_POST y $_COOKIE. Esta tabla también es superglobal; por lo tanto, es accesible en todos los scripts PHP. Si los datos se envían con POST, GET o COOKIE, se pueden recuperar con $_REQUEST.
En el siguiente ejemplo, la página formulario.php contiene dos botones : uno para enviar los datos con POST y el otro con GET.
<!DOCTYPE html
lang="es">
<head>
<title>Ejercicio con REQUEST</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<SCRIPT lenguaje="JAVASCRIPT">
function enviar_formulario() {
//llama la página recibe_post.php con transmisión de las
//variables en la URL
document.location.href="recibe_post.php?nombre="+document.formulario.
nombre.value+"&apellido="+document.formulario.apellido.value;
}
</SCRIPT>
</head>
<body>
<form action="recibe_post.php" method="POST" name="formulario"> ...
Extracción de datos
La función extract importa las variables a una tabla de símbolos, es decir, que esta función toma una tabla como parámetro y luego transforma cada clave en una variable que contiene el valor asociado.
<?php
//Inicialización de la variable $apellido
$apellido = "Martínez";
//Relleno de la tabla
$var_array = array("apellido" => "Durán",
"nombre" => "Roberto",
"edad" => "30");
//Extraccción de la tabla
extract($var_array);
echo "$apellido, $nombre, $edad";
?>
Este ejemplo da como resultado:
Durán, Roberto, 30 |
Observe que la variable $apellido que contiene "Martínez" ha sido sobreescrita.
Esta función se utiliza a menudo en MVC cuando se recupera un $_POST y se desea transformarlo en varias variables.
Zonas con el mismo nombre
Si en un formulario dos o más zonas tienen el mismo nombre, se utilizará la última.
Por ejemplo:
<form action=”recibe_post.php” method=”POST” name=”formulario”>
<h2>Formulario para enviar el nombre y los apellidos</h2>
Apellido: <input type=”text” name=nombre /><br />
Nombre: <input type=”text” name=nombre /><br />
<input type=”submit” name=”enviarPOST” value=”enviar por POST” />
</form>
El valor que se introduce en la zona junto al nombre se transmite por $_POST, ya que las dos zonas se denominan nombre.
Varios formularios en la misma página
Si hay varios formularios en la misma página, estos formularios son independientes y cada botón submit envía los valores del propio formulario.
Por ejemplo:
<form action=”recibe_post.php” method=”POST” name=”formulario”>
<h2>Formulario para enviar el nombre y los apellidos</h2>
Apellido: <input type=”text” name=apellido1 /><br />
Nombre: <input type=”text” name=nombre1 /><br />
<input type=”submit” name=”enviar1” value=”enviar 1” />
</form>
<form action=”recibe_post.php” method=”POST” name=”formulario2”>
<h2>Formulario para enviar el nombre y los apellidos</h2>
Apellido: <input type=”text” name=apellido2 /><br />
Nombre: <input type=”text” name=nombre2 /><br />
<input type=”submit” name=”enviar2” value=”enviar 2” />
</form>
Si pulsa en el botón enviar1, solo se envían los valores de los campos nombre1 y apellido1.
Control de datos y redirección de páginas
1. Introducción
Los datos introducidos en un formulario no son seguros. De hecho, los usuarios pueden escribir letras cuando solicita una edad o introducir un código SQL que puede causar problemas en su página web. Esta última acción se denomina inyección SQL. Para evitar que un usuario pueda hacer inoperativo su sitio web, es necesario proteger los datos introducidos. Se puede comprobar en JavaScript (lado cliente) que los datos introducidos se corresponden con lo que quiere, pero no es el propósito ni es suficiente. También debe codificar las comprobaciones en PHP (lado servidor) antes de guardar los datos en la base de datos.
2. Datos obligatorios
Esta prueba consiste en comprobar si el usuario ha llenado un campo del formulario.
Las zonas de tipo texto, textarea, hidden y password se comprueban de la siguiente manera:
<?php
//Suponiendo que el formulario contenga el campo nombre
if ($_POST['nombre']!= '') {
echo "Su nombre es".$_POST['nombre'];
}
else
{
echo "El nombre no se ha introducido.";
}
?>
En las áreas de tipo radio-button, checkbox y lista, la comprobación es:
<?php
//Suponiendo que el formulario contenga una lista llamada pais
if (isset($_POST['pais']) == true) {
echo "Los países son:";
print_r ($_POST['pais']);
}
else
{
echo "El país no se ha seleccionado.";
}
?>
3. Los filtros
Existe una función PHP que permite filtrar una variable con un filtro específico. La función filter_var() toma como parámetros la variable, el filtro en forma de constante y opcionalmente una tabla de opciones.
Por ejemplo, para verificar que mi dirección de correo electrónico es válida:
<?php
//ejemplo de correo electrónico
$email = "roberto.duran@misitio.com";
//prueba el correo electrónico con la constante FILTER_VALIDATE_EMAIL
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo("$email es una dirección de correo electrónico válida");
} else {
echo("$email...
Ejercicios
1. Enunciados
Ejercicio 1 (fácil)
Cree una página login.php que contenga un formulario con una zona inicio de sesión y una zona contraseña. Añada el botón "comprobar", de tipo submit, que llama la página verif_login.php. Esta página muestra "inicio de sesión correcto" si el apellido es igual a "Gómez" y la contraseña "alibaba", de lo contrario, esta página redirecciona a la página inicio de sesión.php con el mensaje "inicio de sesión incorrecto".
Ejercicio 2 (dificultad media)
Cree una página tabla.php que contenga un formulario con una lista de selección simple que contenga los países y debajo una zona de tipo <div> que muestre las ciudades según el país que seleccione. El formulario contiene un botón de tipo "submit" que permite volver a llamar la misma página según el país que seleccione. Se trata de realizar esta página sin necesidad de utilizar JavaScript. Cuando muestra la página por primera vez, debe mostrar el primer país de la lista con sus correspondientes ciudades. Las dos tablas son:
$pais = array('Francia','Italia','Alemania','Rusia');
Y
$ciudades['Francia'][0] = "París";
$ciudades['Francia'][1] = "Lyon";
$ciudades['Francia'][2] = "Marsella";
$ciudades['Italia'][0] = "Roma";
$ciudades['Italia'][1] = "Milán";
$ciudades['Italia'][2] = "Nápoles";
$ciudades['Alemania'][0] = "Berlín";
$ciudades['Alemania'][1] = "Múnich";
$ciudades['Alemania'][2] = "Fráncfort";
$ciudades['Rusia'][0] = "Moscú";
$ciudades['Rusia'][1] = "San Petersburgo";
$ciudades['Rusia'][2] = "Nizhny-Novgorod";
Ejercicio 3 (dificultad media)
Retome el ejercicio 1 y muestre en la página...