Ejercicios (sesiones) - Sesiones (2) - Soluciones

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

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).

Sesiones (2) 1 - 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-2-1-1.php

<?php
// Accedemos a la sesión5
session_name("sesiones-2-1");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Texto 1 (Formulario)</h1>

<?php
// Si hay un texto guardado en la sesión, lo mostramos 6
if (isset($_SESSION["texto"])) {
    print "  <p>El último texto escrito es: <strong>$_SESSION[texto]</strong>.</p>\n"; 4
    print "\n";
}
?>
  <form action="sesiones-2-1-2.php" method="get">
    <p>Escriba texto:</p>
// ...

sesiones-2-1-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-1");
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"; print "\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"; print "\n"; } ?> <p><a href="sesiones-2-1-1.php">Volver a la primera página.</a></p> // ...

Sesiones (2) 1 - 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-2-1-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";
    print "\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";
    print "\n";
}
?>
    <p><a href="sesiones-2-1-b-1.php">Volver a la primera página.</a></p>
// ...

Sesiones (2) 2 - 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: función recoge() y variable para recoger el dato
  3. Si el dato no es vacío, el dato se guarda en una variable de sesión, para que la página 1 pueda acceder a él.
  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. Finalmente, la página 2 redirige a la página 1.
  6. La página 1 muestra el nombre guardado en $_SESSION.
  7. 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.
  8. 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-2-2-1.php

<?php
// Accedemos a la sesión 6
session_name("sesiones-2-2");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Texto 2 (Formulario)</h1>

<?php
// Si hay un texto guardado en la sesión, lo mostramos 7
if (isset($_SESSION["texto"])) {
    print "  <p>El texto es: <strong>$_SESSION[texto]</strong>.</p>\n"; 5
    print "\n";
}
?>
  <form action="sesiones-2-2-2.php" method="get">
    <p>Escriba texto:</p>
// ...

sesiones-2-2-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-2");
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"); // Si el texto no es vacío, lo guardamos en la sesión 2 if ($texto != "") { $_SESSION["texto"] = $texto; } // Volvemos al formulario 4 header("Location:sesiones-2-2-1.php");

Sesiones (2) 2 - 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-2-2-b-1.php

<?php
// Accedemos a la sesión 1
session_name("sesiones-2-2-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-2-2-b-2.php" method="get">
    <p>Escriba texto:</p>
// ...

sesiones-2-2-b-2.php

<?php
// Accedemos a la sesión 4
session_name("sesiones-2-2-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"); // Si el texto no es vacío, lo guardamos en la sesión 7 if ($texto != "") { $_SESSION["texto"] = $texto; } // Volvemos al formulario 8 header("Location:sesiones-2-2-b-1.php");

Sesiones (2) 3 - 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-2-3-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-2-3");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-2-3-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>\n";
    print "      <label>\n";
    print "        Escriba una palabra en mayúsculas:\n";
    print "        <input type=\"text\" name=\"palabra\" value=\"$_SESSION[palabra]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "      <span class=\"aviso\">$_SESSION[error]</span>\n";
    print "    </p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, lo mostramos... 10
    print "    <p>\n";
    print "      <label>\n";
    print "        Escriba una palabra en mayúsculas:\n";
    print "        <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "    </p>\n";
    print "\n";
}
?>
// ...

sesiones-2-3-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-3");
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-2-3-1.php");

Sesiones (2) 3 - 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-2-3-b-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-2-3-b");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-2-3-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"], $_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 "      <label>\n";
    print "        Escriba una palabra en mayúsculas:\n";
    print "        <input type=\"text\" name=\"palabra\" value=\"$_SESSION[intento]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "      <span class=\"aviso\">$_SESSION[error]</span>\n";
    print "    </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 "      <label>\n";
    print "        Escriba una palabra en mayúsculas:\n";
    print "        <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "      <span class=\"aviso\">$_SESSION[error]</span>\n";
    print "    </p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, mostramos simplemente el control 11
    print "    <p>\n";
    print "      <label>\n";
    print "        Escriba una palabra en mayúsculas:\n";
    print "        <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "    </p>\n";
    print "\n";
}
?>
// ...

sesiones-2-3-b-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-3-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-2-3-b-1.php");

Sesiones (2) 3 - 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-2-3-c-1.php

<?php
// Accedemos a la sesión 8
session_name("sesiones-2-3-c");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabra en mayúsculas (Formulario)</h1>

  <form action="sesiones-2-3-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>\n";
print "      <label>\n";
print "        Escriba una palabra en mayúsculas:\n";
print "        <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\">\n";
print "      </label>\n";

// 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-2-3-c-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-3-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-2-3-c-1.php");

Sesiones (2) 3 - 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-2-3-d-2.php

<?php
// Accedemos a la sesión 5
session_name("sesiones-2-3-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-2-3-d-1.php");

Sesiones (2) 4 - 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.

  1. Por escribir
  2. Por escribir
  3. Por escribir
  4. Por escribir
  5. Por escribir
  6. Por escribir
  7. Por escribir
  8. Por escribir
  9. Por escribir
  10. Por escribir
  11. Por escribir
  12. Por escribir
  13. Por escribir
  14. Por escribir

sesiones-2-4-1.php

<?php
// Accedemos a la sesión 9
session_name("sesiones-2-4");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabras en mayúsculas y minúsculas (Formulario)</h1>

  <form action="sesiones-2-4-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"], $_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>\n";
    print "      <label>\n";
    print "        Mayúsculas:\n";
    print "        <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "      <span class=\"aviso\">$_SESSION[mayusculasError]</span>\n";
    print "    </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>\n";
    print "      <label>\n";
    print "        Mayúsculas:\n";
    print "        <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "     </p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, escribimos el control vacío 12
    print "    <p>\n";
    print "      <label>\n";
    print "        Mayúsculas:\n";
    print "        <input type=\"text\" name=\"mayusculas\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "    </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>\n";
    print "      <label>\n";
    print "        Minúsculas:\n";
    print "        <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "      <span class=\"aviso\">$_SESSION[minusculasError]</span>\n";
    print "    </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>\n";
    print "      <label>\n";
    print "        Minúsculas:\n";
    print "        <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "    </p>\n";
    print "\n";
} else {
    // Si no hemos detectado un error, escribimos el control vacío
    print "    <p>\n";
    print "      <label>\n";
    print "        Minúsculas:\n";
    print "        <input type=\"text\" name=\"minusculas\" size=\"20\" maxlength=\"20\">\n";
    print "      </label>\n";
    print "    </p>\n";
    print "\n";
}
?>
// ...

sesiones-2-4-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-4");
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-2-4-1.php");

Sesiones (2) 4 - 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.

  1. Por escribir
  2. Por escribir
  3. Por escribir
  4. Por escribir
  5. Por escribir
  6. Por escribir
  7. Por escribir
  8. Por escribir
  9. Por escribir
  10. Por escribir
  11. Por escribir
  12. Por escribir
  13. Por escribir
  14. Por escribir

sesiones-2-4-b-1.php

<?php
// Accedemos a la sesión 9
session_name("sesiones-2-4-b");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario Palabras en mayúsculas y minúsculas (Formulario)</h1>

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

<?php
//Si están guardadas en la sesión las dos palabras ... 14
if (isset($_SESSION["mayusculas"], $_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>\n";
print "      <label>\n";
print "        Mayúsculas:\n";
print "        <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"], $_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\">\n";
print "      </label>\n";

// 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>\n";
print "      <label>\n";
print "        Minúsculas:\n";
print "        <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"], $_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\">\n";
print "      </label>\n";


// 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-2-4-b-2.php

<?php
// Accedemos a la sesión 3
session_name("sesiones-2-4-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-2-4-1.php");

Sesiones (2) 5 - Formulario en dos pasos

sesiones-2-5-1.php

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

// Borrramos los datos guardados en intentos anteriores
// salvo el avisoNombre que puede tener que mostrarse en esta página
unset($_SESSION["nombre"]);
unset($_SESSION["apellidos"]);
unset($_SESSION["avisoApellidos"]);
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario en dos pasos (Formulario 1)</h1>

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

    <p>
      <label>
        Nombre:
        <input type="text" name="nombre" size="20" maxlength="20">
      </label>
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["avisoNombre"])) {
    print "      <span class=\"aviso\">$_SESSION[avisoNombre]</span>\n";
}
?>
    </p>

// ...

sesiones-2-5-2.php

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

// Función de recogida de datos
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 nombre $nombre = recoge("nombre"); // Comprobamos el nombre if ($nombre == "") { // Si no hay nombre, guardamos el aviso en la sesión $_SESSION["avisoNombre"] = "No ha escrito su nombre"; // y volvemos a la página 1 header("Location:sesiones-2-5-1.php"); exit; } else { // Si hay nombre, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["avisoNombre"]); // guardamos el nombre en la sesión $_SESSION["nombre"] = $nombre; // y pasamos a la página 3 header("Location:sesiones-2-5-3.php"); exit; }

sesiones-2-5-3.php

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

// Si accedemos a esta página sin haber guardado antes un nombre en la sesión ...
if (!isset($_SESSION["nombre"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-5-1.php");
    exit;
}
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario en dos pasos (Formulario 2)</h1>

  <form action="sesiones-2-5-4.php" method="get">
    <p>Escriba sus apellidos:</p>

    <p>
      <label>
        Apellidos:
        <input type="text" name="apellidos" size="30" maxlength="30">
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["avisoApellidos"])) {
    print "      <span class=\"aviso\">$_SESSION[avisoApellidos]</span>\n";
}
?>
      </label>
    </p>

// ...

sesiones-2-5-4.php

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

// Si accedemos a esta página sin haber guardado antes un nombre en la sesión ...
if (!isset($_SESSION["nombre"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-5-1.php");
    exit;
}

// Función de recogida de datos
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 los apellidos $apellidos = recoge("apellidos"); if ($apellidos == "") { // Si no hay apellidos, guardamos el aviso en la sesión $_SESSION["avisoApellidos"] = "No ha escrito sus apellidos"; // y volvemos a la página 3 header("Location:sesiones-2-5-3.php"); exit; } else { // Si hay apellidos, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["avisoApellidos"]); // guardamos los apellidos en la sesión $_SESSION["apellidos"] = $apellidos; // y pasamos a la página 5 header("Location:sesiones-2-5-5.php"); exit; }

sesiones-2-5-5.php

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

// Si accedemos a esta página sin haber guardado antes un nombre y unos apellidos en la sesión ...
if (!isset($_SESSION["nombre"]) || !isset($_SESSION["apellidos"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-5-1.php");
    exit;
}
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario en dos pasos (Resultado)</h1>

<?php
// Mostramos los datos recibidos
print "  <p>Su nombre y apellidos son: <strong>$_SESSION[nombre] $_SESSION[apellidos]</strong>.</p>\n";
print "\n";
?>
// ...

Sesiones (2) 6 - Formulario de confirmación

sesiones-2-6-1.php

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

// Borrramos los datos guardados en intentos anteriores
// salvo el aviso1 que puede tener que mostrarse en esta página
unset($_SESSION["palabra1"]);
unset($_SESSION["palabra2"]);
unset($_SESSION["aviso2"]);
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario de confirmación (Formulario 1)</h1>

  <form action="sesiones-2-6-2.php" method="get">
    <p>Escriba una palabra (con letras mayúsculas, letras minúsculas y números):</p>

    <p>
      <label>
        Palabra:
        <input type="text" name="palabra1" size="20" maxlength="20">
      </label>
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["aviso1"])) {
    print "      <span class=\"aviso\">$_SESSION[aviso1]</span>\n";
}
?>
    </p>

// ...

sesiones-2-6-2.php

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

// Función de recogida de datos
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 palabra1 $palabra1 = recoge("palabra1"); // Comprobamos la palabra1 if ($palabra1 == "") { // Si no hay palabra1, guardamos el aviso en la sesión $_SESSION["aviso1"] = "No ha escrito nada"; // y volvemos a la página 1 header("Location:sesiones-2-6-1.php"); exit; } elseif (!ctype_alnum($palabra1)) { // Si la palabra1 no son todo letras o números, guardamos el aviso en la sesión $_SESSION["aviso1"] = "No ha escrito una sola palabra con letras y números"; // y volvemos a la página 1 header("Location:sesiones-2-6-1.php"); exit; } else { // Si hay palabra1, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["aviso1"]); // guardamos la palabra1 en la sesión $_SESSION["palabra1"] = $palabra1; // y pasamos a la página 3 header("Location:sesiones-2-6-3.php"); exit; }

sesiones-2-6-3.php

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

// Si accedemos a esta página sin haber guardado antes la palabra1 en la sesión ...
if (!isset($_SESSION["palabra1"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-6-1.php");
    exit;
}
?>
<!DOCTYPE html>
// ...

<body>
  <h1>Formulario de confirmación (Formulario 2)</h1>

  <form action="sesiones-2-6-4.php" method="get">
    <p>Repita la palabra que acaba de escribir:</p>

    <p>
      <label>
        Palabra:
        <input type="text" name="palabra1" size="20" maxlength="20">
      </label>
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["aviso2"])) {
    print "      <span class=\"aviso\">$_SESSION[aviso2]</span>\n";
}
?>
    </p>

// ...

sesiones-2-6-4.php

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

// Si accedemos a esta página sin haber guardado antes una palabra1 en la sesión ...
if (!isset($_SESSION["palabra1"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-6-1.php");
    exit;
}

// Función de recogida de datos
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 palabra2 $palabra2 = recoge("palabra2"); if ($palabra2 == "") { // Si no hay palabra2, guardamos el aviso en la sesión $_SESSION["aviso2"] = "No ha escrito nada"; // y volvemos a la página 3 header("Location:sesiones-2-6-3.php"); exit; } elseif (!ctype_alnum($palabra2)) { // Si la palabra2 no son todo letras o números, guardamos el aviso en la sesión $_SESSION["aviso2"] = "No ha escrito una sola palabra con letras y números"; // y volvemos a la página 3 header("Location:sesiones-2-6-3.php"); exit; } elseif ($_SESSION["palabra1"] != $palabra2) { // Si las palabras son distintas, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["aviso2"]); // Guardamos el aviso en la sesión $_SESSION["aviso1"] = "No ha escrito la misma palabra. Comience de nuevo."; // y volvemos a la página 1 header("Location:sesiones-2-6-1.php"); exit; } else { // Si hay palabra2, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["aviso2"]); // guardamos la palabra2 en la sesión $_SESSION["palabra2"] = $palabra2; // y pasamos a la página 5 header("Location:sesiones-2-6-5.php"); exit; }

sesiones-2-6-5.php

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

// Si accedemos a esta página sin haber guardado antes la palabra1 y la palabra2 en la sesión ...
if (!isset($_SESSION["palabra1"]) || !isset($_SESSION["palabra2"])) {
    // volvemos a la página 1
    header("Location:sesiones-2-5-1.php");
    exit;
}
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Formulario de confirmación (Resultado)</h1>

<?php
// Mostramos la palabra confirmada
print "  <p>Ha escrito y confirmado la palabra: <strong>$_SESSION[palabra1]</strong>.</p>\n";
print "\n";
?>
// ...

Sesiones (2) 7 - Formularios independientes

index.php

La página index.php no contiene código PHP.

nombre-1.php

<?php
// Accedemos a la sesión
session_name("sesiones-2-7");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Nombre (1)</h1>

<?php
// Si hay un nombre guardado en la sesión, ...
if (isset($_SESSION["nombre"])) {
    // lo mostramos
    print "  <p>Usted ya ha escrito que su nombre es: <strong>$_SESSION[nombre]</strong></p>\n";
    print "\n";
}
?>
  <form action="nombre-2.php" method="get">
    <p>Escriba su nombre:</p>

    <p>
      <label>
        Nombre:
        <input type="text" name="nombre" size="20" maxlength="20">
      </label>
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["avisoNombre"])) {
    print "      <span class=\"aviso\">$_SESSION[avisoNombre]</span>\n";
}
?>
    </p>

// ...

nombre-2.php

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

// Función de recogida de datos
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 nombre $nombre = recoge("nombre"); if ($nombre == "") { // Si no hay nombre, guardamos el aviso en la sesión $_SESSION["avisoNombre"] = "No ha escrito su nombre"; // y volvemos a la página nombre-1 header("Location:nombre-1.php"); exit; } else { // Si hay nombre, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["avisoNombre"]); // guardamos el nombre en la sesión $_SESSION["nombre"] = $nombre; // y volvemos a index header("Location:index.php"); exit; }

apellidos-1.php

<?php
// Accedemos a la sesión
session_name("sesiones-2-7");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
  <h1>Apellidos (1)</h1>

<?php
// Si hay unos apellidos guardados en la sesión, ...
if (isset($_SESSION["apellidos"])) {
    // lo mostramosn
    print "  <p>Usted ya ha escrito que sus apellidos son: <strong>$_SESSION[apellidos]</strong></p>\n";
    print "\n";
}
?>
  <form action="apellidos-2.php" method="get">
    <p>Escriba sus apellidos:</p>

    <p>
      <label>
        Apellidos:
        <input type="text" name="apellidos" size="30" maxlength="30">
      </label>
<?php
// Si hay un aviso guardado en la sesión, lo mostramos
if (isset($_SESSION["avisoApellidos"])) {
    print "      <span class=\"aviso\">$_SESSION[avisoApellidos]</span>\n";
}
?>
    </p>

// ...

apellidos-2.php

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

// Función de recogida de datos
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 los apellidos $apellidos = recoge("apellidos"); if ($apellidos == "") { // Si no hay apellidos, guardamos el aviso en la sesión $_SESSION["avisoApellidos"] = "No ha escrito sus apellidos"; // y volvemos a la página apellidos-1 header("Location:apellidos-1.php"); exit; } else { // Si hay apellidos, borramos el aviso que se podría haber generado en intentos anteriores, unset($_SESSION["avisoApellidos"]); // guardamos los apellidos en la sesión $_SESSION["apellidos"] = $apellidos; // y volvemos a index header("Location:index.php"); exit; }

ver.php

<?php
// Accedemos a la sesión
session_name("sesiones-2-7");
session_start();
?>
<!DOCTYPE html>
// ...

<body>
  <h1>Ver datos</h1>

<?php
if (!isset($_SESSION["nombre"]) && !isset($_SESSION["apellidos"])) {
    // Si no hay nombre ni apellidos en la sesión, lo dice
    print "  <p>Usted no ha escrito todavía ni su nombre ni sus apellidos</p>\n";
    print "\n";
} elseif (isset($_SESSION["nombre"]) && !isset($_SESSION["apellidos"])) {
    // Si hay nombre pero no hay apellidos en la sesión, lo dice
    print "  <p>Usted <strong>sólo</strong> ha escrito que su nombre es: <strong>$_SESSION[nombre]</strong></p>\n";
    print "\n";
} elseif (!isset($_SESSION["nombre"]) && isset($_SESSION["apellidos"])) {
    // Si no hay nombre pero sí apellidos en la sesión, lo dice
    print "  <p>Usted <strong>sólo</strong> ha escrito que sus apellidos son: <strong>$_SESSION[apellidos]</strong></p>\n";
    print "\n";
} else {
    // Si hay nombre y apellidos en la sesión, lo dice
    print "  <p>Usted ha escrito que su nombre es: <strong>$_SESSION[nombre]</strong></p>\n";
    print "\n";
    print "  <p>Usted ha escrito que sus apellidos son: <strong>$_SESSION[apellidos]</strong></p>\n";
    print "\n";
}
?>
// ...

borrar.php

<?php
// Accedemos a la sesión
session_name("sesiones-2-7");
session_start();
// Destruimos la sesión
session_destroy();
?>
<!DOCTYPE html>
// ...