Ejercicios (sesiones) - Sesiones (1) - Soluciones

En esta página se muestran una parte de las soluciones de los ejercicios Sesiones (1).

Si lo prefiere, puede descargar unas posibles soluciones completas de estos ejercicios.

¡Atención!Para hacer estos ejercicios, se recomienda seguir el recorrido de la aplicación, suponiendo que el usuario introduce datos. Pero una vez completada la aplicación 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).

Comprobación de formularios

Sesiones (1) 01 - Formulario Texto (1) - Solución A

Nota: La diferencia entre las dos soluciones propuestas para este ejercicio es que la solución B sigue el procedimiento recomendado en estos apuntes de crear una variable auxiliar $xxOk por cada variable que recoge un control del formulario, mientras que la solución A no utiliza esa variable auxiliar ya que en este caso solamente se recoge un control.

La página 1 del ejercicio debe mostrar el último texto escrito por el usuario, texto que es recogido por la segunda página. Para compartir esa información (el texto) entre ambas páginas recurriremos a una variable de sesión, por ejemplo $_SESSION["texto"].

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. En este caso caso, como solo recibimos un dato, podemos simplificar el procedimiento habitual, ahorrándonos la variable auxiliar y realizar los pasos: función recoge(); variable para recoger el dato; comprobación y mensajes de error; si el dato es correcto, mensaje final.
  2. 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
// Accedemos a la sesión5
session_name("sesiones-1-01");
session_start();
?>

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

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

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

sesiones-1-01-2.php

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

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

<?php
// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos el texto
$texto   = recoge("texto");

// Comprobamos el texto y escribimos avisos si es necesario
if ($texto == "") {
    print "  <p class=\"aviso\">No ha escrito su nombre.</p>\n";
} else {2
    // Si el texto es válido, guardamos el texto en la sesión ...
    $_SESSION["texto"] = $texto;
    // y lo mostramos
    print "  <p>El texto es: <strong>$texto</strong>.</p>\n";
}
?>

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

Sesiones (1) 01 - Formulario Texto (1) - Solución B

Nota: La diferencia entre las dos soluciones propuestas para este ejercicio es que la solución B sigue el procedimiento recomendado en estos apuntes de crear una variable auxiliar $xxOk por cada variable que recoge un control del formulario, mientras que la solución A no utiliza esa variable auxiliar ya que en este caso solamente se recoge un control.

Se muestra únicamente la parte de la segunda página en la que aparece la variable auxiliar $textoOk.

sesiones-1-01-b-2.php

<?php
// ...

// Recogemos el texto
$texto   = recoge("texto");
$textoOk = false;

// Comprobamos el texto y escribimos avisos si es necesario
if ($texto == "") {
    print "  <p class=\"aviso\">No ha escrito su nombre.</p>\n";
} else {
    $textoOk = true;
}

// Si el texto es válido,
if ($textoOk) {
  // guardamos el texto en la sesión
    $_SESSION["texto"] = $texto;
    // y lo mostramos
    print "  <p>El texto es: <strong>$texto</strong>.</p>\n";
}
?>

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

Sesiones (1) 02 - Formulario Texto (2) - Solución A

Nota: La diferencia entre las dos soluciones propuestas para este ejercicio es que en la solución A $_SESSION["texto"] nunca es vacío, es decir, antes de que el usuario escriba texto en el formulario $_SESSION["texto"] no existe, mientras que en la solución B $_SESSION["texto"] existe siempre, pero tiene un valor vacío hasta que el usuario escribe texto en el formulario.

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, no escribe ningún mensaje.
  4. Finalmente, si el dato recibido no es correcto, volvemos a la primera página.
  5. Y si el dato es correcto, el dato se guarda en una variable de sesión, para que la página 1 pueda acceder a él.
  6. 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.
  7. Finalmente, la página 2 redirige a la página 1.
  8. La página 1 muestra el nombre guardado en $_SESSION.
  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 añadimos la condición de que la variable que vamos a imprimir exista.

sesiones-1-02-1.php

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

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

<?php
// Si hay un texto guardado en la sesión, lo mostramos 9
if (isset($_SESSION["texto"])) {
    print "  <p>El texto es: <strong>$_SESSION[texto]</strong>.</p>\n"; 7
    print "\n";
}
?>

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

sesiones-1-02-2.php

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

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos el texto
$texto   = recoge("texto");
$textoOk = false;

// Comprobamos el texto
if ($texto == "") {
    // Si el texto es vacío, no es correcto, pero no hacemos nada especial 2
} else {
    $textoOk = true;
}

// Si el texto no es válido ...
if (!$textoOk) {
    // ... volvemos al formulario 3
    header("Location:sesiones-1-02-1.php");
    exit;
} else {
    // ... guardamos el texto en la sesión 4
    $_SESSION["texto"] = $texto;
    // Volvemos al formulario 6
    header("Location:sesiones-1-02-1.php");
    exit;
}
?>

Sesiones (1) 02 - Formulario Texto (2) - Solución B

Nota: La diferencia entre las dos soluciones propuestas para este ejercicio es que en la solución A $_SESSION["texto"] nunca es vacío, es decir, antes de que el usuario escriba texto en el formulario $_SESSION["texto"] no existe, mientras que en la solución B $_SESSION["texto"] existe siempre, pero tiene un valor vacío hasta que el usuario escribe texto en el formulario.

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

  1. Para que la página 1 pueda usar datos de $_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.
  2. La primera vez que se abre la página, $_SESSION no contiene ningún dato, por lo que al acceder a él provocaríamos un error. Para evitar ese problema, creamos la variable de sesión si esta no existe, dándole el valor vacío.
  3. Si hay un valor no vacío en la variable de sesión, lo mostramos.
  4. Para que la página 2 pueda guardar datos en $_SESSION, debemos unir la página a la sesión. El nombre de la sesión debe ser el mismo en ambas páginas.
  5. Si alguien accediera a la segunda página directamente, sin pasar por la página 1, $_SESSION no contendría ningún dato, por lo que al acceder a él provocaríamos un error. Para evitar ese problema, creamos la variable de sesión si esta no existe, dándole el valor vacío. En este caso, en realidad, esta precaución no es necesaria, porque no accedemos al valor sino que simplemente lo establecemos si es necesario, pero en general suele ser necesario.
  6. En la página 2 recogemos el dato enviado por el formulario de la página 1: función recoge() y variable para recoger el dato
  7. Si se ha recibido algo, el dato se guarda en una variable de sesión, para que la página 1 pueda acceder a él.
  8. Finalmente, la página 2 redirige siempre a la página 1.

sesiones-1-02-b-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-1-02-b");
session_start();
// Si no existe la variable de sesión, la creamos vacía 2
if (!isset($_SESSION["texto"])) {
    $_SESSION["texto"] = "";
}
?>

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

<?php// Si hay un texto no vacío guardado en la sesión, lo mostramos 3
if ($_SESSION["texto"] != "") {
    print "  <p>El último texto escrito es: <strong>$_SESSION[texto]</strong>.</p>\n";
    print "\n";
}
?>

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

sesiones-1-02-b-2.php

<?php
// Accedemos a la sesión 4
session_name("sesiones-1-02-b");
session_start();
// Si no existe la variable de sesión, la creamos vacía 5
if (!isset($_SESSION["texto"])) {
    $_SESSION["texto"] = "";
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos el texto
$texto   = recoge("texto");
$textoOk = false;

// Recogemos el texto
$texto = recoge("texto");

// Comprobamos el texto
if ($texto != "") { 7
    // Si el texto no es vacío, lo guardamos en la sesión
    $_SESSION["texto"] = $texto;
}

header("Location:sesiones-1-02-1.php"); 8
?>

Sesiones (1) 03 - Formulario Palabra en mayúsculas - Solución A

Este ejercicio es parecido al anterior. La diferencia es que si la palabra escrita por el usuario es incorrecta, el formulario muestra un mensaje de error y la palabra incorrecta en la caja de texto para su corrección.

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

  1. En la página 2 recogemos el dato enviado por el formulario de la página 1: función recoge() y variable para recoger el dato
  2. Como la primera página muestra siempre la palabra (si es correcta al principio de la página, si es incorrecta en la caja de texto), la guardamos en la sesión.
  3. Por tanto, la página 2 debe conectarse a la sesión.
  4. En la comprobación, si el dato es vacío, se guarda el aviso correspondiente.
  5. Si la palabra no está en mayúsculas, se guarda el aviso correspondiente.
  6. Si la palabra es correcta, se borran los avisos que pudiera haber de intentos anteriores.
  7. Finalmente, volvemos a la primera página.
  8. La página 1 debe conectarse a la sesión.
  9. Si hay un error guardado en la sesión, el formulario muestra el aviso y la palabra en la caja de texto.
  10. Si no hay un error guardado en la sesión, el formulario muestra la caja de texto.
  11. La palabra correcta debe mostrarse cuando no hay error, pero cuando además hay alguna palabra guardada (ya que la primera vez que se accede a la primera página no hay error, pero no debe mostrarse nada).

sesiones-1-03-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03");
session_start();
?>

<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-1-03-2.php" method="get">

<?php
//Si no hemos detectado un error y hay guardada una palabra en la sesión ... 11
if (!isset($_SESSION["error"]) && isset($_SESSION["palabra"])) {
    // ... mostramos la palabra
    print "  <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
    print "\n";
}

print "    <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";

// Si hemos detectado un error 9
if (isset($_SESSION["error"])) {
    // Mostramos el control, añadiendo el aviso e incluyendo el valor incorrecto en el control
    print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" value=\"$_SESSION[palabra]\" size=\"20\" maxlength=\"20\"></label> "
        . "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, lo mostramos... 10
    print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
}
?>
// ...

sesiones-1-03-2.php

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

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos la palabra
$palabra   = recoge("palabra");

// Guardamos la palabra en la sesión 2
$_SESSION["palabra"] = $palabra;

// Comprobamos la palabra
if ($palabra == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
    $_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error 5
    $_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
} else {
    // Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
    unset($_SESSION["error"]);
}

// Volvemos al formulario 7
header("Location:sesiones-1-03-1.php");
?>

Sesiones (1) 03 - Formulario Palabra en mayúsculas - Solución B

Esta solución establece tres variables de sesión en vez de las dos de la solución anterior: el mensaje de error, la palabra correcta y la palabra incorrecta.

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

  1. En la página 2 recogemos el dato enviado por el formulario de la página 1: función recoge() y variable para recoger el dato
  2. Borramos todas las variables de sesión establecidas anteriormente.
  3. Por tanto, la página 2 debe conectarse a la sesión.
  4. En la comprobación, si el dato es vacío, se guarda el aviso correspondiente.
  5. Si la palabra no está en mayúsculas, se guarda el aviso correspondiente y la palabra escrita por el usuario (para mostrarla en la caja de texto).
  6. Si la palabra es correcta, se guarda la palabra escrita por el usuario.
  7. Finalmente, volvemos a la primera página.
  8. La página 1 debe conectarse a la sesión.
  9. Si hay un error y un intento guardados en la sesión, el formulario muestra el aviso y la palabra en la caja de texto.
  10. Si hay un error guardado en la sesión, el formulario muestra el aviso.
  11. Si no hay un error guardado en la sesión, el formulario muestra la caja de texto.
  12. Si hay una palabra guardada en la sesión, la palabra correcta debe mostrarse antes del formulario (ya que la palabra sólo se guarda cuando es correcta).

sesiones-1-03-b-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03-b");
session_start();
?>

<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-1-03-b-2.php" method="get">

<?php
//Si hay guardada una palabra en la sesión ... 12
if (isset($_SESSION["palabra"])) {
    // ... mostramos la palabra
    print "  <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
    print "\n";
}

print "    <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";

if (isset($_SESSION["error"]) && isset($_SESSION["intento"])) {
    // Si hemos detectado un error y el usuario había escrito una palabra para corregir 9
    // Mostramos el control, añadiendo el aviso e incluyendo el valor incorrecto en el control
    print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" value=\"$_SESSION[intento]\" size=\"20\" maxlength=\"20\"></label> "
    . "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
    print "\n";
} elseif (isset($_SESSION["error"])) {
    // Si hemos detectado un error, pero no hay palabra para corregir 10
    // Mostramos el control, añadiendo el aviso
    print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label> "
        . "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, mostramos simplemente el control 11
    print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
}
?>
// ...

sesiones-1-03-b-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-1-03-b");
session_start();

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos la palabra
$palabra   = recoge("palabra");

// Borramos todos los datos anteriores 2
unset($_SESSION["intento"]);
unset($_SESSION["error"]);
unset($_SESSION["palabra"]);

// Comprobamos la palabra
if ($palabra == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
    $_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 5
    $_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
    $_SESSION["intento"] = $palabra;
} else {
    // Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
    $_SESSION["palabra"] = $palabra;
}

// Volvemos al formulario 7
header("Location:sesiones-1-03-b-1.php");
?>

Sesiones (1) 03 - Formulario Palabra en mayúsculas - Solución C

Esta solución es una variante de la anterior. La segunda página es igual, la diferencia está en la primera página. En vez de escribir un control completo distinto dependiendo de las variables guardadas en la sesión de la solución B, en esta solución el control se escribe en varios print y entre medias se escriben bloques if que añaden texto en caso necesario.

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

  1. En la página 2 recogemos el dato enviado por el formulario de la página 1: función recoge() y variable para recoger el dato
  2. Borramos todas las variables de sesión establecidas anteriormente.
  3. Por tanto, la página 2 debe conectarse a la sesión.
  4. En la comprobación, si el dato es vacío, se guarda el aviso correspondiente.
  5. Si la palabra no está en mayúsculas, se guarda el aviso correspondiente y la palabra escrita por el usuario (para mostrarla en la caja de texto).
  6. Si la palabra es correcta, se guarda la palabra escrita por el usuario.
  7. Finalmente, volvemos a la primera página.
  8. La página 1 debe conectarse a la sesión.
  9. Si hay un intento guardados en la sesión, añadimos el atributo value.
  10. Si hay un error guardado en la sesión, añadimos el error.
  11. Si hay una palabra guardada en la sesión, la palabra correcta debe mostrarse antes del formulario (ya que la palabra sólo se guarda cuando es correcta).

sesiones-1-03-c-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03-c");
session_start();
?>

<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-1-03-c-2.php" method="get">

<?php
//Si hay guardada una palabra en la sesión ... 11
if (isset($_SESSION["palabra"])) {
    // ... mostramos la palabra
    print "    <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
    print "\n";
}

print "    <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";

print "    <p><label>Palabra: <input type=\"text\" name=\"palabra\" ";

// Si hay que incluir el intento anterior en value, lo incluimos 9
if (isset($_SESSION["intento"])) {
    print "value=\"$_SESSION[intento]\" ";
}

print "size=\"20\" maxlength=\"20\"></label> ";

// Si hay que incluir un aviso, lo incluimos 10
if (isset($_SESSION["error"])) {
    print "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
}

print "\n";
?>
// ...

sesiones-1-03-c-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-1-03-c");
session_start();

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos la palabra
$palabra   = recoge("palabra");

// Borramos todos los datos anteriores 2
unset($_SESSION["intento"]);
unset($_SESSION["error"]);
unset($_SESSION["palabra"]);

// Comprobamos la palabra
if ($palabra == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
    $_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 5
    $_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
    $_SESSION["intento"] = $palabra;
} else {
    // Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
    $_SESSION["palabra"] = $palabra;
}

// Volvemos al formulario 7
header("Location:sesiones-1-03-c-1.php");
?>

Sesiones (1) 03 - Formulario Palabra en mayúsculas - Solución D

Esta solución es una variante de la anterior, en la que sólo cambia la segunda página. En vez de borrar todas las variables de sesión anteriores y en el bloque if elseif else establecer las variables necesarias, en esta solución en cada opción del bloque if elseif else se borran o establecen cada una de las variables de la sesión.

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

  1. En la página 2 recogemos el dato enviado por el formulario de la página 1: función recoge() y variable para recoger el dato
  2. En la comprobación, si el dato es vacío, se guarda el aviso correspondiente y se borran el intento y la palabra anteriores.
  3. Si la palabra no está en mayúsculas, se guarda el aviso correspondiente y el intento y se borra la palabra anterior.
  4. Si la palabra es correcta, se guarda la palabra escrita por el usuario y se borran el intento y el error anteriores.
  5. Por tanto, la página 2 debe conectarse a la sesión.
  6. Finalmente, volvemos a la primera página.

sesiones-1-03-d-2.php

<?php
// Accedemos a la sesión 5
session_name("sesiones-1-03-d");
session_start();

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos la palabra
$palabra   = recoge("palabra");

// Comprobamos la palabra, guardamos el dato que queremos enseñar y borramos el resto
if ($palabra == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 2
    unset($_SESSION["intento"]);
    $_SESSION["error"] = "No ha escrito ninguna palabra";
    unset($_SESSION["palabra"]);
} elseif (!ctype_upper($palabra)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 3
    $_SESSION["intento"] = $palabra;
    $_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
    unset($_SESSION["palabra"]);
} else {
    // Si la palabra es correcta, guardamos en la sesión la palabra 4
    unset($_SESSION["intento"]);
    unset($_SESSION["error"]);
    $_SESSION["palabra"] = $palabra;
}

// Volvemos al formulario 6
header("Location:sesiones-1-03-d-1.php");
?>

Sesiones (1) 04 - Formulario Palabras en mayúsculas y minúsculas - Solución A

Este ejercicio es parecido al anterior. La diferencia es que como hay dos controles, tenemos el doble de variables de sesión. Además, hay que tener en cuenta que si un control se escribe bien, pero el otro se escribe mal, el valor correcto se debe incluir en el control para que el usuario no lo tenga que volver a escribir.

sesiones-1-04-1.php

<?php
// Accedemos a la sesión 9
session_name("sesiones-1-04");
session_start();
?>

<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-1-04-2.php" method="get">

<?php
//Si no hemos detectado error en la palabra en mayúsculas y hay guardada una palabra en la sesión ... 14
if (!isset($_SESSION["mayusculasError"]) && !isset($_SESSION["minusculasError"])
    && isset($_SESSION["mayusculas"]) && isset($_SESSION["minusculas"]) ) {
    // ... mostramos la palabra
    print "    <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[mayusculas]</strong>.</p>\n";
    print "\n";
    print "    <p>Ha escrito una palabra en minúsculas: <strong>$_SESSION[minusculas]</strong>.</p>\n";
    print "\n";
}

print "    <p>Escriba una palabra en mayúsculas y otra en minúsculas:</p>\n";
print "\n";

// Si hemos detectado un error en la palabra en mayúsculas
if (isset($_SESSION["mayusculasError"])) {
    // Escribimos un aviso e incluimos el valor incorrecto en el control 10
    print "    <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\"></label> "
        . "<span class=\"aviso\">$_SESSION[mayusculasError]</span></p>\n";
    print "\n";
} elseif (isset($_SESSION["minusculasError"])) {
    // Si hemos detectado un error en la palabra en minúsculas, incluimos el valor correcto en el control 11
    print "    <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, escribimos el control vacío 12
    print "    <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
}

// Si hemos detectado un error en la palabra en minúsculas 13
if (isset($_SESSION["minusculasError"])) {
    // Escribimos un aviso e incluimos el valor incorrecto en el control
    print "    <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\"></label> "
    . "<span class=\"aviso\">$_SESSION[minusculasError]</span></p>\n";
    print "\n";
} elseif (isset($_SESSION["mayusculasError"])) {
    // Si hemos detectado un error en la palabra en mayúsculas, incluimos el valor correcto en el control
    print "    <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, escribimos el control vacío
    print "    <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" size=\"20\" maxlength=\"20\"></label></p>\n";
    print "\n";
}
?>
// ...

sesiones-1-04-2.php

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

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos las dos palabras
$mayusculas = recoge("mayusculas");
$minusculas = recoge("minusculas");

// Guardamos las palabras en la sesión 2
$_SESSION["mayusculas"] = $mayusculas;
$_SESSION["minusculas"] = $minusculas;

// Comprobamos la palabra en mayúsculas
if ($mayusculas == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
    $_SESSION["mayusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($mayusculas)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error 5}
    $_SESSION["mayusculasError"] = "No ha escrito la palabra en mayúsculas";
} else {
    // Si la palabra es correcta, borramos los posibles errores anteriores 6
    unset($_SESSION["mayusculasError"]);
}

// Comprobamos la palabra en minúsculas 7
if ($minusculas == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error
    $_SESSION["minusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_lower($minusculas)) {
    // Si la palabra está en mayúsculas, guardamos en la sesión el mensaje de error
    $_SESSION["minusculasError"] = "No ha escrito la palabra en minúsculas";
} else {
    // Si la palabra es correcta, borramos los posibles errores anteriores
    unset($_SESSION["minusculasError"]);
}

// Volvemos al formulario 8
header("Location:sesiones-1-04-1.php");
?>

Sesiones (1) 04 - Formulario Palabras en mayúsculas y minúsculas - Solución B

Como en el caso del ejercicio 3, en el que se han ofrecido varias soluciones, esta solución es algo distinta a la anterior.

sesiones-1-04-b-1.php

<?php
// Accedemos a la sesión 9
session_name("sesiones-1-04-b");
session_start();
?>

<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-1-04-b-2.php" method="get">

<?php
//Si están guardadas en la sesión las dos palabras ... 14
if (isset($_SESSION["mayusculas"]) && isset($_SESSION["minusculas"]) ) {
    // ... mostramos las dos palabras
    print "    <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[mayusculas]</strong>.</p>\n";
    print "\n";
    print "    <p>Ha escrito una palabra en minúsculas: <strong>$_SESSION[minusculas]</strong>.</p>\n";
    print "\n";
}

print "    <p>Escriba una palabra en mayúsculas y otra en minúsculas:</p>\n";
print "\n";

print "    <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" ";

if (isset($_SESSION["mayusculasIntento"])) {
    // Si hemos detectado un intento incorrecto en la palabra en mayúsculas, incluimos el intento en el control 10
    print "value=\"$_SESSION[mayusculasIntento]\" ";
} elseif (isset($_SESSION["minusculasError"]) && isset($_SESSION["mayusculas"])) {
    // Si la palabra en mayúsculas es correcta, pero hemos detectado un error en la palabra en minúsculas, incluimos la palabra correcta en el control 11
    print "value=\"$_SESSION[mayusculas]\" ";
}

print "size=\"20\" maxlength=\"20\"></label> ";

// Si hemos detectado un error en la palabra en mayúsculas 12
if (isset($_SESSION["mayusculasError"])) {
    // Escribimos el aviso
    print "<span class=\"aviso\">$_SESSION[mayusculasError]</span>";
}

print "</p>\n";
print "\n";

print "    <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" ";

if (isset($_SESSION["minusculasIntento"])) {
    // Si hemos detectado un intento incorrecto en la palabra en minúsculas, incluimos el intento en el control 13
    print "value=\"$_SESSION[minusculasIntento]\" ";
} elseif (isset($_SESSION["mayusculasError"]) && isset($_SESSION["minusculas"])) {
    // Si la palabra en minúsculas es correcta, pero hemos detectado un error en la palabra en mayúsculas, incluimos la palabra correcta en el control
    print "value=\"$_SESSION[minusculas]\" ";
}

print "size=\"20\" maxlength=\"20\"></label> ";

// Si hemos detectado un error en la palabra en minúsculas
if (isset($_SESSION["minusculasError"])) {
    // Escribimos el aviso
    print "<span class=\"aviso\">$_SESSION[minusculasError]</span>";
}

print "</p>\n";
print "\n";
?>
// ...

sesiones-1-04-b-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-1-04-b");
session_start();

// Función de recogida de datos 1
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos las dos palabras
$mayusculas = recoge("mayusculas");
$minusculas = recoge("minusculas");

// Borramos los valores anteriores 2
session_unset();

// Comprobamos la palabra en mayúsculas
if ($mayusculas == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
    $_SESSION["mayusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($mayusculas)) {
    // Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y la palabra 5
    $_SESSION["mayusculasIntento"] = $mayusculas;
    $_SESSION["mayusculasError"] = "No ha escrito la palabra en mayúsculas";
} else {
    // Si la palabra es correcta, guardamos en la sesión la palabra 6
    $_SESSION["mayusculas"] = $mayusculas;
}

// Comprobamos la palabra en minúsculas 7
if ($minusculas == "") {
    // Si no se recibe palabra, guardamos en la sesión el mensaje de error
    $_SESSION["minusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_lower($minusculas)) {
    // Si la palabra está en mayúsculas, guardamos en la sesión el mensaje de error y la palabra
    $_SESSION["minusculasIntento"] = $minusculas;
    $_SESSION["minusculasError"] = "No ha escrito la palabra en minúsculas";
} else {
    // Si la palabra es correcta, guardamos en la sesión la palabra
    $_SESSION["minusculas"] = $minusculas;
}

// Volvemos al formulario 8
header("Location:sesiones-1-04-1.php");
?>

Gráficos

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

Es importante recordar que el usuario sólo va a ver la página 1 del programa, ya que la página 2 va a redirigir siempre automáticamente a la página 1. Por ello, la página 2 no debe tener ningún fragmento de HTML, ni ningún print.

  1. Para que las dos páginas del programa puedan utilizar el número que hay que mostrar en pantalla (en la página 1 el número se muestra y en la página 2 se modifica), guardaremos ese número en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlo o modificarlo provocaría un error, por lo que damos valor a la variable si no existe.
  3. La página 1 muestra el número guardado en $_SESSION.
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si la variable de sesión no está definida, redirigiremos a la página 1 donde se le dará un valor inicial.
  6. 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 cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. En la página 2 modificamos el valor guardado en la sesión, dependiendo del dato recibido (se aumenta, se reduce o se pone a cero).
  8. Finalmente, la página 2 redirige a la página 1.

sesiones-1-11-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-1-11");
session_start();

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

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

<?php
// Mostramos el número, guardado en la sesión 3
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-11-2.php

<?php
// Accedemos a la sesión 4
session_name("sesiones-1-11");
session_start();

// Si el número no está guardado en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["numero"])) {
    header("Location:sesiones-1-11-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Dependiendo de la acción recibida, modificamos el número guardado 7
if ($accion == "cero") {
    $_SESSION["numero"] = 0;
} elseif ($accion == "subir") {
    $_SESSION["numero"]++;
} elseif ($accion == "bajar") {
    $_SESSION["numero"]--;
}

// Volvemos al formulario 8
header("Location:sesiones-1-11-1.php");

Sesiones (1) 12 - 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. Para que las dos páginas del programa puedan utilizar la coordenada del punto (en la página 1 el número se incluye en el dibujo y en la página 2 se modifica), guardaremos el número en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlo o modificarlo provocaría un error, por lo que damos valor a la variable si no existe.
  3. La página 1 coloca el punto rojo en el valor guardado en $_SESSION.
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si la variable de sesión no está definida, redirigiremos a la página 1 donde se le dará un valor inicial.
  6. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 2 botones que tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. En la página 2 modificamos el valor guardado en la sesión, dependiendo del dato recibido (se aumenta, se reduce o se pone a cero).
  8. 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.
  9. Finalmente, la página 2 redirige a la página 1.

sesiones-1-12-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-1-12");
session_start();

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

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

sesiones-1-12-2.php

<?php
// Accedemos a la sesión 4
session_name("sesiones-1-12");
session_start();

// Si la posición no está guardada en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["posicion"])) {
    header("Location:sesiones-1-12-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Dependiendo de la acción recibida, modificamos el número guardado 7
if ($accion == "centro") {
    $_SESSION["posicion"] = 0;
} elseif ($accion == "izquierda") {
    $_SESSION["posicion"] -= 20;
} elseif ($accion == "derecha") {
    $_SESSION["posicion"] += 20;
}

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

// Volvemos al formulario 9
header("Location:sesiones-1-12-1.php");

Sesiones (1) 13 - 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. Para que las dos páginas del programa puedan utilizar las coordenadas del punto (en la página 1 los valores se incluyen en el dibujo y en la página 2 se modifican), guardaremos ambos números en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlo o modificarlo provocaría un error, por lo que damos valor a las dos variables si no existe alguna de ellas.
  3. La página 1 coloca el punto rojo mediante los dos valores guardados en $_SESSION.
  4. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si alguna variable de sesión no está definida, redirigiremos a la página 1 donde se le dará un valor inicial.
  6. 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 que tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  7. En la página 2 modificamos el valor o los valores guardados en la sesión, dependiendo del dato recibido (se aumenta uno u otro, se reduce uno u otro o se ponen a cero ambos).
  8. 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.
  9. Finalmente, la página 2 redirige a la página 1.
  10. .

sesiones-1-13-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-1-13");
session_start();

// Si alguna posición no está guardada en la sesión, ponemos los dos valores a cero 2
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
// Dibujamos el círculo en su posición 3
print "            <circle cx=\"$_SESSION[x]\" cy=\"$_SESSION[y]\" r=\"8\" fill=\"red\" />\n";
?>

  </svg>
  </td>
// ...

sesiones-1-13-2.php

<?php
// Accedemos a la sesión 4
session_name("sesiones-1-13");
session_start();

// Si alguna posición no está guardada en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["x"]) || !isset($_SESSION["y"])) {
    header("Location:sesiones-1-13-1.php");
    exit;
}

// Función de recogida de datos 6
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Dependiendo de la acción recibida, modificamos el número guardado 7
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 el punto sale por la izquierda o la derecha, entra por el otro lado 8
if ($_SESSION["x"] > 200) {
    $_SESSION["x"] = -200;
} elseif ($_SESSION["x"] < -200) {
    $_SESSION["x"] = 200;
}

// Si el punto sale por arriba o por abajo, entra por el otro lado
if ($_SESSION["y"] > 200) {
    $_SESSION["y"] = -200;
} elseif ($_SESSION["y"] < -200) {
    $_SESSION["y"] = 200;
}

// Volvemos al formulario 9
header("Location:sesiones-1-13-1.php");

Sesiones (1) 14 - Votar una opción

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

  1. Los datos clave de este programa son las longitudes de las barras de colores. Para que las dos páginas del programa puedan utilizar o modificar estos valores, guardaremos ambos números en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  2. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimirlo o modificarlo provocaría un error, por lo que damos valor a las dos variables si no existe alguna de ellas.
  3. La página 1 dibuja la primera barra a partir de uno de los valores guardado en $_SESSION. El valor se utiliza en dos atributos.
  4. La página 1 dibuja la segunda barra a partir del otro valor guardado en $_SESSION. El valor se utiliza en dos atributos.
  5. Para que la página 2 pueda modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  6. Si alguna variable de sesión no está definida, redirigiremos a la página 1 donde se le dará un valor inicial.
  7. 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 que tienen el mismo name, por lo que sólo hay que recoger un dato.

    Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato

  8. En la página 2 modificamos uno o los dos valores, dependiendo del dato recibido (se aumenta uno, se aumenta el otro, o se ponen a cero ambos).
  9. Finalmente, la página 2 redirige a la página 1.
  10. .

sesiones-1-14-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-1-14");
session_start();

// Si algún contador no está guardado en la sesión, ponemos ambos a cero 2
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: hwb(200 0% 0%);">✔</button></td>
        <td>
<?php
// Dibujamos la primera barra 3
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=\"hwb(200 0% 0%)\" 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: hwb(35 0% 0%)">✔</button></td>
        <td>
<?php
// Dibujamos la segunda barra 4
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=\"hwb(35 0% 0%)\" stroke-width=\"50\" />\n";
print "          </svg>\n";
?>
        </td>
      </tr>
    </table>
// ...

sesiones-1-14-2.php

<?php
// Accedemos a la sesión 5
session_name("sesiones-1-14");
session_start();

// Si alguno de los números de votos no está guardado en la sesión, ponemos ambos a cero 6
if (!isset($_SESSION["a"]) || !isset($_SESSION["b"])) {
    $_SESSION["a"] =  $_SESSION["b"] = 0;
}

// Función de recogida de datos 7
function recoge($key, $type = "")
{
    if (!is_string($key) && !is_int($key) || $key == "") {
        trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
    } elseif ($type !== "" && $type !== []) {
        trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
    }
    $tmp = $type;
    if (isset($_REQUEST[$key])) {
        if (!is_array($_REQUEST[$key]) && !is_array($type)) {
            $tmp = trim(htmlspecialchars($_REQUEST[$key]));
        } elseif (is_array($_REQUEST[$key]) && is_array($type)) {
            $tmp = $_REQUEST[$key];
            array_walk_recursive($tmp, function (&$value) {
                $value = trim(htmlspecialchars($value));
            });
        }
    }
    return $tmp;
}

// Recogemos accion
$accion = recoge("accion");

// Dependiendo de la acción recibida, modificamos el número correspondiente 8
if ($accion == "a") {
    $_SESSION["a"] += 10;
} elseif ($accion == "b") {
    $_SESSION["b"] += 10;
} elseif ($accion == "cero") {
    $_SESSION["a"] = $_SESSION["b"] = 0;
}

// Volvemos al formulario 9
header("Location:sesiones-1-14-1.php");
?>