Soluciones - Sesiones (1)

En esta página se muestran una parte de las soluciones de los ejercicios Sesiones (1). La solución completa se puede descargar de la página de soluciones.

¡Atención!Únicamente he actualizado en esta páginas la solución de los cinco primeros ejercicios. En el archivo para descargar se encuentra las soluciones completas.

¡Atención!Para hacer estos ejercicios, se recomienda seguir el recorrido de la aplicación, suponiendo que el usuario introduce datos. Pero después hay que comprobar desde el principio (cerrando el navegador previamente) que la aplicación funciona correctamente (es decir, que la aplicación tiene en cuenta que la primera vez que se ejecuta, todavía no hay datos).

Ejercicios iniciales

Sesiones (1) 01 - Formulario Nombre (1)

Este podría ser el orden en que se iría realizando este ejercicio:

  1. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. Es el procedimiento habitual: función recoge(), variable para recoger el dato, variable auxiliar que indica la corrección del dato, comprobación y mensajes de error, si el dato es correcto, mensaje final.
  2. Pero si el dato es correcto, debemos guardarlo en una variable de sesión, para que la página 1 pueda acceder a él.
  3. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  4. La página 1 muestra el nombre guardado en $_SESSION.
  5. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  6. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que añadimos la condición de que la variable que vamos a imprimir exista.

sesiones-1-01-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-01");
session_start();
?>

<!DOCTYPE html>
...
<body>
  <h1>Formulario Nombre 1 (Formulario)</h1>

<?php
// Si hay un nombre guardado en la sesión, se muestra
if (isset($_SESSION["nombre"])) {
    print "  <p>Su nombre es: <strong>$_SESSION[nombre]</strong>.</p>\n";
    print "\n";
}
?>

  <form action="sesiones-1-01-2.php" method="get">
    <p>Escriba su nombre:</p>
...

sesiones-1-01-2.php

<?php
// Se accede a la sesión
session_name("sesiones-1-01");
session_start();
?>

<!DOCTYPE html>
...
<body>
  <h1>Formulario Nombre 1 (Resultado)</h1>

<?php
// Funciones auxiliares
function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

// Recogida de nombre
$nombre   = recoge("nombre");
$nombreOk = false;

// Comprobación de nombre
if ($nombre == "") {
    print "  <p class=\"aviso\">No ha escrito su nombre.</p>\n";
} else {
    $nombreOk = true;
}

// Si el nombre es válido ...
if ($nombreOk) {
  // se guarda el nombre en la sesión
    $_SESSION["nombre"] = $nombre;
    // y se muestra
    print "  <p>Su nombre es: <strong>$nombre</strong>.</p>\n";
}
?>

    <p><a href="sesiones-1-01-1.php">Volver a la primera página.</a></p>
...

Sesiones (1) 02 - Formulario Nombre (2)

Este ejercicio es muy parecido al anterior. Este podría ser el orden en que se iría realizando este ejercicio:

  1. Puesto que la página 2 redirige a la página 1, la página 2 no debe tener nada de HTML, ni ningún print.
  2. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. Al principio es el procedimiento habitual: función recoge(), variable para recoger el dato, variable auxiliar que indica la corrección del dato, ...
  3. ... pero en la comprobación si no se recibe nada, vuelve al formulario.
  4. ... y si el dato es correcto, tampoco se imprime ningún mensaje, pero el dato se guarda en una variable de sesión, para que la página 1 pueda acceder a él.
  5. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  6. Finalmente, la página 2 redirige a la página 1.
  7. La página 1 muestra el nombre guardado en $_SESSION.
  8. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  9. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que añadimos la condición de que la variable que vamos a imprimir exista.

sesiones-1-02-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-02");
session_start();
?>

<!DOCTYPE html>
...
<body>
  <h1>Formulario Nombre 2 (Formulario)</h1>

<?php
// Si hay un nombre guardado en la sesión, se muestra
if (isset($_SESSION["nombre"])) {
    print "  <p>Su nombre es: <strong>$_SESSION[nombre]</strong>.</p>\n";
    print "\n";
}
?>

  <form action="sesiones-1-02-2.php" method="get">
    <p>Escriba su nombre:</p>
...

sesiones-1-02-2.php

<?php
// Se accede a la sesión
session_name("sesiones-1-02");
session_start();

// Funciones auxiliares
function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

// Recogida de nombre
$nombre   = recoge("nombre");
$nombreOk = false;

// Comprobación de nombre
if ($nombre == "") {
    // Si no se recibe nombre, se vuelve al formulario
    header("location:sesiones-1-02-1.php");
    exit;
} else {
    $nombreOk = true;
}

// Si el nombre es válido ...
if ($nombreOk) {
  // guarda el nombre en la sesión
    $_SESSION["nombre"] = $nombre;
    // y vuelve al formulario
    header("location:sesiones-1-02-1.php");
    exit;
}
?>

Sesiones (1) 03 - Subir y bajar número

  1. Puesto que la página 2 redirige a la página 1, la página 2 no debe tener nada de HTML, ni ningún print.
  2. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 3 botones, pero los tres tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en el ejercicio anterior: función recoge(), variable para recoger el dato, variable auxiliar que indica la corrección del dato, comprobación y reenvío al formualrio si no es uno de los valores válidos ...

  3. El valor que muestra la página 1 se modifica en la página 2, dependiendo del dato recibido (se aumenta, se reduce o se pone a cero).
  4. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  5. La variable de sesión se debe inicializar antes de modificarla (la manera más simple de hacerlo es darle valor si no existe).
  6. Finalmente, la página 2 redirige a la página 1.
  7. La página 1 muestra el número guardado en $_SESSION.
  8. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  9. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que damos valor a la variable si no existe.

sesiones-1-03-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-03");
session_start();

// Si el número no está guardado en la sesión, lo pone a cero
if (!isset($_SESSION["numero"])) {
    $_SESSION["numero"] = 0;
}
?>

<!DOCTYPE html>
...
    <p>
      <button type="submit" name="accion" value="bajar" style="font-size: 4rem">-</button>

<?php
// Muestra el número, guardado en la sesión
print "      <span style=\"font-size: 4rem\">$_SESSION[numero]</span>\n";
?>

      <button type="submit" name="accion" value="subir" style="font-size: 4rem">+</button>
    </p>
...

sesiones-1-03-2.php

<?php
// Se accede a la sesión
session_name("sesiones-1-03");
session_start();

// Si el número no está guardado en la sesión, vuelve al formulario
if (!isset($_SESSION["numero"])) {
    $_SESSION["numero"] = 0;
}

// Funciones auxiliares
function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

// Recogida de accion
$accion = recoge("accion");
$accionOk = false;

// Comprobación de accion
if ($accion != "Poner a cero" && $accion != "subir" && $accion != "bajar") {
    // Si no es una de las tres posibles acciones, se vuelve al formulario
    header("location:sesiones-1-03-1.php");
    exit;
} else {
    $accionOk = true;
}

// Si la accion recibibida es válida ...
if ($accionOk) {
    // Cambia el valor del número
    if ($accion == "Poner a cero") {
        $_SESSION["numero"] = 0;
    } elseif ($accion == "subir") {
        $_SESSION["numero"] ++;
    } elseif ($accion == "bajar") {
        $_SESSION["numero"] --;
    }

    // y vuelve al formulario
    header("location:sesiones-1-03-1.php");
    exit;
}
?>

Sesiones (1) 04 - Mover un punto a derecha e izquierda

Este ejercicio es muy similar al anterior: mediante dos botones se aumenta o disminuye un valor. la diferencia es que en este ejercicio el valor no se muestra, pero se utiliza para situar un punto en una línea.

  1. Puesto que la página 2 redirige a la página 1, la página 2 no debe tener nada de HTML, ni ningún print.
  2. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 3 botones, pero los tres tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en el ejercicio anterior: función recoge(), variable para recoger el dato, variable auxiliar que indica la corrección del dato, comprobación y reenvío al formualrio si no es uno de los valores válidos ...

  3. El valor que se utiliza en la página 1 se modifica en la página 2, dependiendo del dato recibido (se aumenta, se reduce o se pone a cero).
  4. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  5. La variable de sesión se debe inicializar antes de modificarla (la manera más simple de hacerlo es darle valor si no existe).
  6. Finalmente, la página 2 redirige a la página 1.
  7. La página 1 dibuja el punto rojo en la imagen SVG utilizando el número guardado en $_SESSION.
  8. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  9. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que damos valor a la variable si no existe.
  10. Para que cuando el punto salga por un lado del dibujo entre por el otro, se debe comprobar si el valor supera los extremos y, en su caso, cambiarlo por el otro valor extremo.

sesiones-1-04-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-04");
session_start();

// Si la posición no está guardada en la sesión, la pone a cero
if (!isset($_SESSION["posicion"])) {
    $_SESSION["posicion"] = 0;
}
?>

<!DOCTYPE html>
...
            <line x1=\"-300\" y1=\"10\" x2=\"300\" y2=\"10\" stroke=\"black\" stroke-width=\"5\" />
<?php
// Dibuja el círculo en su posición
print "            <circle cx=\"$_SESSION[posicion]\" cy=\"10\" r=\"8\" fill=\"red\" />\n";
?>
          </svg>
...

sesiones-1-04-2.php

<?php
// Se accede a la sesión
session_name("sesiones-1-04");
session_start();

// Si la posición no está guardada en la sesión, la pone a cero
if (!isset($_SESSION["posicion"])) {
    $_SESSION["posicion"] = 0;
}

// Funciones auxiliares
function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

// Recogida de accion
$accion = recoge("accion");
$accionOk = true;

// Comprobación de accion
if ($accion != "Volver al centro" && $accion != "izquierda" && $accion != "derecha") {
    // Si no es una de las tres posibles acciones, se vuelve al formulario
    header("location:sesiones-1-04-1.php");
    exit;
} else {
    $accionOk = true;
}

// Si la accion recibibida es válida ...
if ($accionOk) {
    //se mueve el punto
    if ($accion == "Volver al centro") {
        $_SESSION["posicion"] = 0;
    } elseif ($accion == "izquierda") {
        $_SESSION["posicion"] -= 20;
    } elseif ($accion == "derecha") {
        $_SESSION["posicion"] += 20;
    }

    // si sale por un lado, entra por el otro
    if ($_SESSION["posicion"] > 300) {
        $_SESSION["posicion"] = -300;
    } elseif ($_SESSION["posicion"] < -300) {
        $_SESSION["posicion"] = 300;
    }

    // y vuelve al formulario
    header("location:sesiones-1-04-1.php");
    exit;
}
?>

Sesiones (1) 05 - Mover un punto en dos dimensiones

Este ejercicio es muy similar al anterior. La diferencia es que en este ejercicio se tendrán que guardar dos valores (coordenada X y coordenada Y) para situar el punto en el plano.

  1. Puesto que la página 2 redirige a la página 1, la página 2 no debe tener nada de HTML, ni ningún print.
  2. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 5 botones, pero los cinco tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en el ejercicio anterior: función recoge(), variable para recoger el dato, variable auxiliar que indica la corrección del dato, comprobación y reenvío al formualrio si no es uno de los valores válidos ...

  3. Los dos valores que se utilizan en la página 1 se modifican en la página 2, dependiendo del dato recibido (se aumenta o se reduce uno de ellos o se ponen los dos a cero).
  4. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  5. Las variables de sesión se deben inicializar antes de modificarlas (la manera más simple de hacerlo es darles valor si no existen).
  6. Finalmente, la página 2 redirige a la página 1.
  7. La página 1 constuye una imagen SVG utilizando los dos números guardados en $_SESSION.
  8. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  9. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que damos valor a las variables si no existen.
  10. Para que cuando el punto salga por un lado del dibujo entre por el otro, se debe comprobar si el valor supera los extremos y, en su caso, cambiarlo por el otro valor extremo.

sesiones-1-05-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-05");
session_start();

// Si alguna posición no está guardada en la sesión, las pone a cero
if (!isset($_SESSION["x"]) || !isset($_SESSION["y"])) {
    $_SESSION["x"] = $_SESSION["y"] = 0;
}
?>

<!DOCTYPE html>
...
        <td>
          <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
          width="400" height="400" viewbox="-200 -200 400 400" style="border: black 2px solid">

<?php
// Dibuja el círculo en su posición
print "            <circle cx=\"$_SESSION[x]\" cy=\"$_SESSION[y]\" r=\"8\" fill=\"red\" />\n";
?>

  </svg>
  </td>
...

sesiones-1-05-2.php

<?php
// Se accede a la sesión
session_name("sesiones-1-05");
session_start();

// Si alguna posición no está guardada en la sesión, las pone a cero
if (!isset($_SESSION["x"]) || !isset($_SESSION["y"])) {
    $_SESSION["x"] = $_SESSION["y"] = 0;
}

// Funciones auxiliares
function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

// Recogida de accion
$accion   = recoge("accion");
$accionOk = true;

// Comprobación de accion
if ($accion != "centro" && $accion != "izquierda" && $accion != "derecha"
    && $accion != "arriba" && $accion != "abajo") {
    // Si no es una de las tres posibles acciones, se vuelve al formulario
    header("location:sesiones-1-05-1.php");
    exit;
} else {
    $accionOk = true;
}

// Si la accion recibibida es válida ...
if ($accionOk) {
    //se mueve el punto
    if ($accion == "centro") {
        $_SESSION["x"] = $_SESSION["y"] = 0;
    } elseif ($accion == "izquierda") {
        $_SESSION["x"] -= 20;
    } elseif ($accion == "derecha") {
        $_SESSION["x"] += 20;
    } elseif ($accion == "arriba") {
        $_SESSION["y"] -= 20;
    } elseif ($accion == "abajo") {
        $_SESSION["y"] += 20;
    }

    // si sale por un lado, entra por el otro
    if ($_SESSION["x"] > 200) {
        $_SESSION["x"] = -200;
    } elseif ($_SESSION["x"] < -200) {
        $_SESSION["x"] = 200;
    }

    // si sale por un lado, entra por el otro
    if ($_SESSION["y"] > 200) {
        $_SESSION["y"] = -200;
    } elseif ($_SESSION["y"] < -200) {
        $_SESSION["y"] = 200;
    }

    // y vuelve al formulario
    header("location:sesiones-1-05-1.php");
    exit;
}
?>

Sesiones (1) 06 - Votar una opción

Este ejercicio es muy similar al anterior. La diferencia es que cada valor se utiliza en un dibujo distinto.

  1. Puesto que la página 2 redirige a la página 1, la página 2 no debe tener nada de HTML, ni ningún print.
  2. Primero, la página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 3 botones, pero los tres tienen el mismo name, por lo que sólo hay que recoger un dato.

    No hace falta comprobar el dato porque el programa sólo hará caso de los valores correctos.

  3. Los dos valores que se utilizan en la página 1 se modifican en la página 2, dependiendo del dato recibido (se aumenta uno de ellos o se ponen los dos a cero).
  4. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  5. Las variables de sesión se deben inicializar antes de modificarlas (la manera más simple de hacerlo es darles valor si no existen).
  6. Finalmente, la página 2 redirige a la página 1.
  7. La página 1 constuye la primera imagen SVG utilizando uno de los números guardados en $_SESSION. El número se utiliza en dos sitios.
  8. La página 1 constuye la segunda imagen SVG utilizando el otro número guardado en $_SESSION. El número se utiliza en dos sitios.
  9. Para que la página 1 pueda usar datos de $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  10. Pero la primera vez que se abre la página, $_SESSION no contiene ningún dato e intentar imprimirlo provocaría un error, por lo que damos valor a las variables si no existen.

sesiones-1-06-1.php

<?php
// Se accede a la sesión
session_name("sesiones-1-06");
session_start();

// Si algún contador no está guardado en la sesión, los pone a cero
if (!isset($_SESSION["a"]) || !isset($_SESSION["b"])) {
    $_SESSION["a"] =  $_SESSION["b"] = 0;
}
?>

<!DOCTYPE html>
...
      <tr>
        <td style="vertical-align: top;"><button type="submit" name="accion" value="a" style="font-size: 60px; line-height: 50px; color: hsl(200, 100%, 50%);">✔</button></td>
        <td>
<?php
print "          <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "            width=\"$_SESSION[a]\" height=\"50\">\n";
print "            <line x1=\"0\" y1=\"25\" x2=\"$_SESSION[a]\" y2=\"25\" stroke=\"hsl(200, 100%, 50%)\" stroke-width=\"50\" />\n";
print "          </svg>\n";
?>
        </td>
      <tr>
        <td><button type="submit" name="accion" value="b" style="font-size: 60px; line-height: 50px; color: hsl(35, 100%, 50%)">✔</button></td>
        <td>
<?php
print "          <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print "            width=\"$_SESSION[b]\" height=\"50\">\n";
print "            <line x1=\"0\" y1=\"25\" x2=\"$_SESSION[b]\" y2=\"25\" stroke=\"hsl(35, 100%, 50%)\" stroke-width=\"50\" />\n";
print "          </svg>\n";
?>
        </td>
      </tr>
    </table>
...

sesiones-1-06-2.php

<?php
session_name("sesiones-1-06");
session_start();

if (!isset($_SESSION["a"]) || !isset($_SESSION["b"])) {
    $_SESSION["a"] =  $_SESSION["b"] = 0;
}

function recoge($var)
{
    $tmp = (isset($_REQUEST[$var]))
    ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "UTF-8"))
    : "";
    return $tmp;
}

$accion = recoge("accion");

if ($accion == "a") {
    $_SESSION["a"] += 10;
} elseif ($accion == "b") {
    $_SESSION["b"] += 10;
} elseif ($accion == "cero") {
    $_SESSION["a"] = $_SESSION["b"] = 0;
}

header("location:sesiones-1-06-1.php");
?>