Peticiones y respuestas en PHP

Entonces ¿cómo interactuamos con la "petición" (REQUEST) y cómo podemos crear una "respuesta" (RESPONSE) utilizando PHP?
PHP nos abstrae un poco de todo el proceso. Veamos un ejemplo:

<?php
 $uri = $_SERVER['REQUEST_URI'];
 $foo = $_GET['foo'];

 header('Content-type: text/html');
 echo 'La URI solicitada es: ' . $uri;
 echo 'El valor del parámetro "foo" es: ' . $foo;
?>

Por extraño que parezca, esta pequeña aplicación, está tomando información de la petición HTTP y la utiliza para modificar la respuesta HTTP del servidor.
En lugar de analizar el mensaje HTTP de la petición, PHP prepara variables superglobales tales como **$_SERVER** y **$_GET** que contienen toda la información de la petición. Del mismo modo, en lugar de devolver la respuesta HTTP con formato de texto, podemos usar la función **header()** para añadir cabeceras a la respuesta y simplemente imprimir el contenido real que será la porción que contiene el mensaje de la respuesta.
Si accedemos a la siguiente url:

http://localhost/sesion02/request.php?foo=hola

PHP genera el resultado de la ejecución del script y devuelve el resultado al servidor que se encarga de crear la respuesta HTTP para devolverla al cliente:

HTTP/1.1 200 OK
Date: Fri, 11 Oct 2013 09:43:42 GMT
Server: Apache/2.2.22 (Win32) PHP/5.3.13
X-Powered-By: PHP/5.3.13
Content-Length: 101
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

La URI solicitada es: /sesion02/request.php?foo=hola<br >El valor del par&aacute;metro "foo" es: hola

Es interesante destacar la siguiente línea :

 header('Content-type: text/html');

Es una función PHP que nos permite agregar cabeceras a una respuesta HTTP:

Content-Type: text/html

Como es la cabecera 'Content-Type'

 $uri = $_SERVER['REQUEST_URI'];

 $foo = $_GET['foo'];

En esas dos líneas vemos la forma de acceder al REQUEST\_URI y al valor del parámetro **foo** de la QUERY\_STRING. Esa es la forma que nos ofrece PHP para gestionar los datos del servidor ($\_SERVER) y la información del protocolo HTTP mediante GET ($\_GET)

Más adelante hablaremos de los arrays superglobales $_GET, $_SERVER, $_POST, $_REQUEST, etc. Además en la sección de arrays hablaremos de la forma de acceder a los arrays indexados asociativamente (no hay índice numérico sino que el índice es una palabra. Es como su tuviéramos un mapa HASH)

Ahora que hemos visto qué nos ofrece PHP para interactuar con el protocolo HTTP, vamos a ir aprendiendo algo más de la sintaxis básica de PHP apoyándonos en el estudio del manejo de los datos recibidos a través de la URL (GET) y a partir de un formulario (POST).

Anteriormente hemos indicado que una URL tenía la siguiente estructura:

http://servidor[:puerto]/ruta?query_string

La **query string** es la parte de la URL que utiliza el protocolo HTTP para transmitir datos con el método GET. Los datos son separados del resto de la URL por medio del carácter “?”. A continuación se concatenarán pares parámetro-valor, separados por el carácter “&”. Veámoslo con un ejemplo.
Creamos un nuevo fichero llamado **get.php** con el siguiente código:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Info web page</title>
</head>
<body>
<?php
    $nombre = $_GET["nombre"];
    $edad   = $_GET['edad'];

    echo "Hola! <b>$nombre</b>, tienes $edad años.<br/>";
    echo "Si quieres accede a mi ". '<a href="web.php?nombre=' . $nombre . '">web</a>';
?>
</body>
</html>

Ahora probamos con este ejemplo:

http://localhost/sesion02/get.php?nombre=pepe&edad=30

Obteniendo este resultado:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Info web page</title>
</head>
<body>
Hola! <b>pepe</b>, tienes 30 años.<br/>
Si quieres accede a mi <a href="web.php?nombre=pepe">web</a>
</body>
</html>

REQUEST:

GET /sesion02/get.php?nombre=pepe&edad=30 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

RESPONSE:

HTTP/1.1 200 OK
Date: Thu, 11 Oct 2012 14:06:45 GMT
Server: Apache/2.2.22 (Win32) PHP/5.3.3
X-Powered-By: PHP/5.3.3
Content-Length: 221
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Info web page</title>
</head>
<body>
Hola! <b>pepe</b>, tienes 30 años.<br/>Si quieres accede a
mi <a href="web.php?nombre=pep">web</a></body>
</html>

En este caso estaremos pasando dos datos al servidor usando el método GET.
El primer parámetro es **nombre** cuyo valor es pepe, mientras que el segundo parámetro es **edad** y su valor es **20**.
Tal y como se ha comentado anteriormente, PHP nos abstrae de todo el proceso de tratamiento de la información enviada vía GET o POST.

Es importante destacar que muchas veces tendremos enlaces del estilo del código anterior:

echo "Si quieres accede a mi ". '<a href="web.php?nombre=' . $nombre . '">web</a>';

Esta es una de las formas de pasar información a un script mediante el protocolo GET. Por ejemplo, la página de inicio de una tienda de libros tendrá un listado de las últimas novedades y el título de los mismos será un enlace una página para mostrar la ficha del libro.
En esa página, mediante el array $_GET obtendremos el identificador de dicho libro, obtendremos la información de la base de datos, por ejemplo, y mostraremnos toda la información en dicha pagina.
Otro ejemplo podría ser la página principal de un periódico, la cual tendrá multitud de noticias y probablemente el título de cada una de las noticias tendrá una enlace a la página para visualizar todo el contenido de las mismas.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>UAzon :: Página principal</title>
</head>
<body>
<p>Últimas novedades:</p>< br/>
<a href="verLibro.php?id=1">'Guerra y paz' de Leo Tolstoi</a>
</body>
</html>

Siguiendo con la forma de interactuar con el servidor mediante HTTP, HTML nos proporciona el elemento **form** donde podemos enviar grandes volúmenes de información.
Normalmente los formularios están asociados al método POST ya que éste envia la información en otro mensaje independiente de las cabeceras.
Para alcanzar la meta de interactuar con el usuario, vamos a crear un formulario donde dicho usuario pueda introducir información arbitraria y procesaremos esa información con PHP.

Para continuar con nuestro ejemplo donde mostramos un mensaje de bienvenida personalizado, invitamos al usuario a que escriba su nombre y hacer que aparezca en una página de resultados.
Para que usuario escriba esa información, tendremos que usar un formulario HTML.

Creamos un formulario HTML en un fichero llamado **form.html** copiamos en él siguiente código:

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>Form name</title>
   </head>
   <body>
      <form action="saluda.php" method="post">
           <div><label for="nombre">Nombre:
<input type="text" name="nombre" id="nombre"></label>
       </div>
       <div><label for="apellidos">Apellidos:
<input type="text" name="apellidos" id="apellidos"></label>
       </div>
       <div><input type="submit" value="Enviar" name="submit"></div>
    </form>
   </body>
</html>

Observemos como el campo **action** del formulario está asignado a un fichero PHP llamado **saluda.php**.
Además se ha elegido como **method** el método POST. Esto quiere decir que al pulsar el botón "Enviar" (destacar que es de tipo **submit**) se generará un mensaje REQUEST con método POST donde las cabeceras van por un lado y los datos van por otro.

Este código genera el formulario de la siguiente figura:

Formulario para crear un mensaje personalizado

Un vez rellenados los campos (nombre=Pepe y apellidos=Reina) pulsamos el botón de Enviar:

Resultado del envío de datos con el formulario

¿Cómo recogemos los datos enviados por el usuario con el formulario? ¿Por dónde vienen los datos? Como dichos datos provienen por POST, PHP nos proporciona igualmente un nuevo array superglobal llamado $\_POST, el cual lo usaremos como usamos anteriormente el array $\_GET y $\_REQUEST. A continuación podemos ver el código:

<html>
   <head>
      <title>Tu nombre</title>
   </head>
   <body>
    <?php
        $nombre     = $_POST['nombre'];
        $apellidos  = $_POST['apellidos'];

        echo 'Bienvenido a nuestra web, ' .
        htmlspecialchars($nombre) . ' ' .
        htmlspecialchars($apellidos) . '!';
    ?>
    </body>
</html>

La solicitud generada por el cliente hacia el servidor sería la siguiente:

POST /sesion02/saluda.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/sesion02/form.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
nombre=Pepe&apellidos=Reina&submit=Enviar

En las dos siguientes figuras podemos ver la información que nos proporciona el plugin firebug de Firefox. Primero vemos la cabecera de la comunicación entre cliente y servidor:

Cabeceras enviadas en la petición

La otra pestaña "POST" dentro de la misma petición:

Parámetros enviados en la petición

En la siguiente imagen vemos de forma visual como se envían los parámetros al mensaje POST y PHP se encarga de procesar ese mensaje creando el índice correspondiente en el array $\_POST, en este caso, y dándole valor a ese índice.

Explicación visual de cómo se emparejan los datos enviados mediante POST

Es evidente que lo más lógico es nombrar los campos de tal forma que sean autoexplicativos para no perder más tiempo del debido a la hora de buscar errores o que otra persona lea nuestro código. Por ejemplo, si vamos a crear un campo que va almacenar el dni el nombre de dicho campo debería de llamarse dni. Así sucesivamente.

<input type="text" name="dni" id="dni">

<input type="text" name="email" id="email">

Hemos comentado anteriormente que en el atributo **method** del formulario también se puede usar GET como método de envío.

 <form action="saluda.php" method="get">

Si cambiamos el método y pulsamos el botón de "Enviar" se generará un request pero de tipo GET mostrando la información en la url. En la siguiente figura vemos el resultado de pulsar dicho botón:

Usando un formulario con el método GET

Como vemos en la imagen queda al descubierto el valor de los campos enviados por el usuario con los problemas de seguridad que eso conlleva.
Además vemos una serie de errores mostrados por PHP y el además el resultado no es el esperado.

¿Qué pueden significiar esos dos errores PHP?

Notice: Undefined index: nombre in C:\wamp\www\sesion02\saluda.php on line 7

Notice: Undefined index: apellidos in C:\wamp\www\sesion02\saluda.php on line 8

Primero destacar que no son errores en sí, sino avisos en tiempo de ejecución del tipo **E\_NOTICE**. Más adelante hablaremos de los errores en PHP y cómo gestionarlos.

E_NOTICE es una constante PHP que muestra avisos en tiempo de ejecución que podrían provocar un error posterior. Lo más importante es que no paran la ejecucion del script. Para más información accede a esta entrada del manual de PHP: Constantes predefinidas en PHP

Lo segundo que debemos destacar es que si volvemos a ver el script PHP **saluda.php** que procesa ese formulario:

<html>
   <head>
      <title>Tu nombre</title>
   </head>
   <body>
    <?php
        $nombre     = $_POST['nombre'];
        $apellidos  = $_POST['apellidos'];

        echo 'Bienvenido a nuestra web, ' .
        htmlspecialchars($nombre) . ' ' .
        htmlspecialchars($apellidos) . '!';
    ?>
    </body>
</html>

Vemos que en las líneas 7 y 8 del script hacen uso del array $\_POST por lo que para solucionar los errores tan sólo tendríamos que cambiar el acceso al array $\_POST por $\_GET o por $\_REQUEST y ya funcionaría como anteriormente.

<html>
   <head>
      <title>Tu nombre</title>
   </head>
   <body>
    <?php
        $nombre     = $_REQUEST['nombre'];
        $apellidos  = $_REQUEST['apellidos'];

        echo 'Bienvenido a nuestra web, ' .
        htmlspecialchars($nombre) . ' ' .
        htmlspecialchars($apellidos) . '!';
    ?>
    </body>
</html>

El usar $\_REQUEST tiene una ventaja clara que es que da igual por donde envíe el usuario el dato, tanto por GET como POST podremos acceder a él.
La desventaja principal es que no queda claro de donde procede esa información si por GET o por POST y eso podría llevarnos a confusiones o problemas de seguridad.

En la siguiente tabla vemos un listado de las tres arrays superglobales con los que podemos interectuar con el usuario según el método utilizado:

Array superglobal Descripción
$_GET Contiene una lista de todos los campos junto a sus valores enviados a través de un formulario mediante el método GET
$_POST Contiene una lista de todos los campos junto a sus valores enviados a través de un formulario mediante el método POST
$_REQUEST Contiene una cambinación de todos lo que contiene el array $_GET y $_POST, junto con los valores de array superglobal $_COOKIE

Tanto en el manual de PHP como en la bibliografía recomiendan usar los arrays $\_GET y $\_POST, ya que, de forma autodocumentada queda clara la procedencia de los datos (GET o POST).
Otra recomendación que nos dan es que suele ser muy incómodo trabajar con nombres de variable tan largos: $\_GET o $\_POST, por lo que se crean variables con el mismo nombre al inicio del fichero que contengan una copia de estos valores.

results matching ""

    No results matching ""