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.
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-01-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-01");
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-01-2.php" method="get">
<p>Escriba su nombre:</p>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["avisoNombre"])) {
// lo mostramos
print " <p>\n";
print " <label>Nombre: <input type=\"text\" name=\"nombre\" size=\"20\" maxlength=\"20\"></label>\n";
print " <span class=\"aviso\">$_SESSION[avisoNombre]</span></p>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Nombre: <input type=\"text\" name=\"nombre\" size=\"20\" maxlength=\"20\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
sesiones-2-01-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-01");
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-01-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-01-3.php");
exit;
}
sesiones-2-01-3.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-01");
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-01-1.php");
exit;
}
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario en dos pasos (Formulario 2)</h1>
<form action="sesiones-2-01-4.php" method="get">
<p>Escriba sus apellidos:</p>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["avisoApellidos"])) {
// lo mostramos
print " <p>\n";
print " <label>Apellidos: <input type=\"text\" name=\"apellidos\" size=\"30\" maxlength=\"30\"></label>\n";
print " <span class=\"aviso\">$_SESSION[avisoApellidos]</span>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Apellidos: <input type=\"text\" name=\"apellidos\" size=\"30\" maxlength=\"30\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
sesiones-2-01-4.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-01");
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-01-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-01-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-01-5.php");
exit;
}
sesiones-2-01-5.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-01");
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-01-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-02-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-02");
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-02-2.php" method="get">
<p>Escriba una palabra (con letras mayúsculas, letras minúsculas y números):</p>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["aviso1"])) {
// lo mostramos
print " <p>\n";
print " <label>Palabra: <input type=\"text\" name=\"palabra1\" size=\"20\" maxlength=\"20\"></label>\n";
print " <span class=\"aviso\">$_SESSION[aviso1]</span>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Palabra: <input type=\"text\" name=\"palabra1\" size=\"20\" maxlength=\"20\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
sesiones-2-02-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-02");
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-02-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-02-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-02-3.php");
exit;
}
sesiones-2-02-3.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-02");
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-02-1.php");
exit;
}
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario de confirmación (Formulario 2)</h1>
<form action="sesiones-2-02-4.php" method="get">
<p>Repita la palabra que acaba de escribir:</p>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["aviso2"])) {
// lo mostramos
print " <p>\n";
print " <label>Escriba de nuevo: <input type=\"text\" name=\"palabra2\" size=\"30\" maxlength=\"30\"></label>\n";
print " <span class=\"aviso\">$_SESSION[aviso2]</span>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Escriba de nuevo: <input type=\"text\" name=\"palabra2\" size=\"30\" maxlength=\"30\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
sesiones-2-02-4.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-02");
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-02-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-02-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-02-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-02-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-02-5.php");
exit;
}
sesiones-2-02-5.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-02");
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-01-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";
?>
// ...
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-03");
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";
}
?>
<form action="nombre-2.php" method="get">
<p>Escriba su nombre:</p>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["avisoNombre"])) {
// lo mostramos
print " <p>\n";
print " <label>Nombre: <input type=\"text\" name=\"nombre\" size=\"20\" maxlength=\"20\"></label>\n";
print " <span class=\"aviso\">$_SESSION[avisoNombre]</span>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Nombre: <input type=\"text\" name=\"nombre\" size=\"20\" maxlength=\"20\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
nombre-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-03");
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-03");
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>
<?php
// Si hay un aviso guardado en la sesión, ...
if (isset($_SESSION["avisoApellidos"])) {
// lo mostramos
print " <p>\n";
print " <label>Apellidos: <input type=\"text\" name=\"apellidos\" size=\"30\" maxlength=\"30\"></label>\n";
print " <span class=\"aviso\">$_SESSION[avisoApellidos]</span>\n";
print " </p>\n";
print "\n";
} else {
// si no, no mostramos el aviso
print " <p>\n";
print " <label>Apellidos: <input type=\"text\" name=\"apellidos\" size=\"30\" maxlength=\"30\"></label>\n";
print " </p>\n";
print "\n";
}
?>
// ...
apellidos-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-03");
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-03");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Ver datos</h1>
<?php
if (!isset($_SESSION["nombre"]) and !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";
} elseif (isset($_SESSION["nombre"]) and !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";
} elseif (!isset($_SESSION["nombre"]) and 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";
} 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";
}
?>
// ...
borrar.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-03");
session_start();
// Destruimos la sesión
session_destroy();
?>
<!DOCTYPE html>
// ...
En esta solución se utilizan dos variables de sesión (el número de cartas a mostrar y el mensaje a mostrar). De esta manera, la primera página sólo escribe los valores de las variables de sesión. Toda la "lógica" del programa está en la segunda página.
sesiones-1-11-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-11");
session_start();
// Si falta una de los dos variables de sesión, reiniciamos los valores
if (!isset($_SESSION["cartas"], $_SESSION["mensaje"])) {
$_SESSION["cartas"] = rand(3, 10);
$_SESSION["mensaje"] = " <p>Quedan $_SESSION[cartas] cartas. Haga clic en el dibujo para eliminar una carta.</p>\n";
}
?>
<!DOCTYPE html>
// ...
<body>
<h1>Quita cartas</h1>
<?php
// Escribimos el mensaje
print $_SESSION["mensaje"];
?>
<form action="sesiones-2-11-2.php">
<p>
<button type="submit" name="quita" value="quita" style="background-color: #eee;">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
width="210" height="250" viewBox="-10 -10 210 250">
<defs>
<pattern id="patron-1" x="0" y="0" width="10" height="10" patternUnits="userSpaceOnUse" >
<rect x="0" y="0" width="10" height="10" fill="hwb(0 60% 0%)" />
<line x1="0" y1="10" x2="10" y2="0" stroke="hwb(0 80% 0%)" stroke-width="1" />
<line x1="0" y1="0" x2="10" y2="10" stroke="hwb(0 80% 0%)" stroke-width="1" />
</pattern>
</defs>
<?php
// Hacemos un bucle para dibujar el número de cartas guardado en la sesión
for ($i = 0; $i < $_SESSION["cartas"]; $i++) {
$pos = 10 * $i;
print " <rect x=\"$pos\" y=\"$pos\" width=\"100\" height=\"140\" rx=\"5\" ry=\"5\" style=\"stroke: black; fill: url(#patron-1);\" />\n";
}
?>
// ...
sesiones-1-11-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-11");
session_start();
// Si falta una de los dos variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["cartas"], $_SESSION["mensaje"])) {
header("Location:sesiones-2-11-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 orden de quitar una carta
$quita = recoge("quita");
// Si hemos recibido la orden de quitar una carta ...
if ($quita == "quita") {
// reducimos el número de cartas a mostrar guardado
$_SESSION["cartas"] -= 1;
// Si el número de cartas a mostrar guardado era cero y al reducirlo se hace negativo ...
if ($_SESSION["cartas"] < 0) {
// lo generamos al azar
$_SESSION["cartas"] = rand(3, 10);
}
// Guardamos el mensaje correspondiente al número de cartas
if ($_SESSION["cartas"] == 0) {
$_SESSION["mensaje"] = " <p>No quedan cartas. Haga clic en el dibujo para volver a poner cartas.</p>\n";
} elseif ($_SESSION["cartas"] == 1) {
$_SESSION["mensaje"] = " <p>Queda $_SESSION[cartas] sola carta. Haga clic en el dibujo para eliminarla.</p>\n";
} else {
$_SESSION["mensaje"] = " <p>Quedan $_SESSION[cartas] cartas. Haga clic en el dibujo para eliminar una carta.</p>\n";
}
}
// Volvemos a la primera página
header("Location:sesiones-2-11-1.php");
En esta solución se utiliza únicamente una variable de sesión (el número de cartas a mostrar). Eso obliga a que en la primera página se tenga que decidir el mensaje a mostrar.
sesiones-1-11-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-11-b");
session_start();
// Si el número de cartas no está guardado en la sesión, lo generamos al azar
if (!isset($_SESSION["cartas"])) {
$_SESSION["cartas"] = rand(3, 10);
}
?>
<!DOCTYPE html>
// ...
<body>
<h1>Quita cartas</h1>
<?php
if ($_SESSION["cartas"] == 0) {
// Si no quedan cartas, lo dice
print " <p>No quedan cartas. Haga clic en el dibujo para volver a poner cartas.</p>\n";
} elseif ($_SESSION["cartas"] == 1) {
// Si no queda una sola carta, lo dice
print " <p>Queda $_SESSION[cartas] sola carta. Haga clic en el dibujo para eliminarla.</p>\n";
} else {
// Si quedan varias cartas, lo dice
print " <p>Quedan $_SESSION[cartas] cartas. Haga clic en el dibujo para eliminar una carta.</p>\n";
}
?>
<form action="sesiones-2-11-b-2.php">
<p>
<button type="submit" name="quita" value="quita" style="background-color: #eee;">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
width="210" height="250" viewBox="-10 -10 210 250">
<defs>
<pattern id="patron-1" x="0" y="0" width="10" height="10" patternUnits="userSpaceOnUse" >
<rect x="0" y="0" width="10" height="10" fill="hwb(0 60% 0%)" />
<line x1="0" y1="10" x2="10" y2="0" stroke="hwb(0 80% 0%)" stroke-width="1" />
<line x1="0" y1="0" x2="10" y2="10" stroke="hwb(0 80% 0%)" stroke-width="1" />
</pattern>
</defs>
<?php
for ($i = 0; $i < $_SESSION["cartas"]; $i++) {
$pos = 10 * $i;
print " <rect x=\"$pos\" y=\"$pos\" width=\"100\" height=\"140\" rx=\"5\" ry=\"5\" style=\"stroke: black; fill: url(#patron-1);\" />\n";
}
?>
// ...
sesiones-1-11-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-11-b");
session_start();
// Si el número de cartas no está guardado en la sesión, redirigimos a la primera página
if (!isset($_SESSION["cartas"])) {
header("Location:sesiones-2-11-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 orden de quitar una carta
$quita = recoge("quita");
// Si hemos recibido la orden de quitar una carta ...
if ($quita == "quita") {
// reducimos el número de cartas a mostrar guardado
$_SESSION["cartas"] -= 1;
// Si el número de cartas a mostrar guardado era cero y al reducirlo se hace negativo ...
if ($_SESSION["cartas"] < 0) {
// lo generamos al azar
$_SESSION["cartas"] = rand(3, 10);
}
}
// Volvemos a la primera página
header("Location:sesiones-2-11-b-1.php");
sesiones-1-12-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-12-1");
session_start();
// Si el ahorro no está guardado en la sesión, inicializamos el valor a cero
if (!isset($_SESSION["ahorro"])) {
$_SESSION["ahorro"] = 0;
}
?>
<!DOCTYPE html>
// ...
</g>
<?php
// Mostramos la cantidad ahorrada
print " <text x=\"170\" y=\"110\" font-size=\"60\" text-anchor=\"middle\">$_SESSION[ahorro]</text>\n";
?>
// ...
sesiones-1-12-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-12-1");
session_start();
// Si el ahorro no está guardado en la sesión, redirigimos a la primera página
if (!isset($_SESSION["ahorro"])) {
header("Location:sesiones-2-12-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 moneda y la acción
$moneda = recoge("moneda");
$accion = recoge("accion");
if ($accion == "Vaciar hucha") {
// Si la acción es vacíar la hucha, se vacía
$_SESSION["ahorro"] = 0;
} elseif (in_array($moneda, [0.01, 0.02, 0.05, 0.10, 0.20, 0.50, 1, 2])) {
// Si llega una moneda, se añade
$_SESSION["ahorro"] += $moneda;
}
// Volvemos a la primera página
header("Location:sesiones-2-12-1.php");
En esta solución se utilizan cinco variables de sesión (el número de turnos ganados por cada jugador, los dos emojis y la moneda a mostrar). De esta manera, la primera página sólo escribe los valores de las variables de sesión. Toda la "lógica" del programa está en la segunda página.
sesiones-1-13-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-13");
session_start();
// Si falta una de los dos variables de sesión, reiniciamos los valores
if (!isset($_SESSION["puntosG"], $_SESSION["puntosM"], $_SESSION["moneda"])) {
$_SESSION["puntosG"] = 0;
$_SESSION["puntosM"] = 0;
$_SESSION["moneda"] = "";
$_SESSION["caraG"] = "😼";
$_SESSION["caraM"] = "🙊";
}
?>
<!DOCTYPE html>
// ..
<table style="text-align: center;">
<tr>
<th>Jugador A</th>
<th>Resultado</th>
<th>Jugador B</th>
</tr>
<?php
print " <tr style=\"font-size: 400%\">\n";
// Mostramos la puntuación del gato
print " <td>$_SESSION[puntosG]</td>\n";
print " <td></td>\n";
// Mostramos la puntuación del mono
print " <td>$_SESSION[puntosM]</td>\n";
print " </tr>\n";
print " <tr style=\"font-size: 400%\">\n";
// Mostramos la cara del gato
print " <td>$_SESSION[caraG]</td>\n";
// Mostramos la moneda
print " <td>$_SESSION[moneda]</td>\n";
// Mostramos la cara del mono
print " <td>$_SESSION[caraM]</td>\n";
print " </tr>\n";
?>
// ...
sesiones-1-13-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-13");
session_start();
// Si falta una de los dos variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["puntosG"], $_SESSION["puntosM"], $_SESSION["moneda"])) {
header("Location:sesiones-2-13-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 acción
$siguiente = recoge("siguiente");
if ($siguiente == "Lanzar moneda") {
// Si la acción es lanzar la moneda ...
// Lanzamos la moneda
$moneda = rand(1, 2);
// Calculamos quién gana el turno y la imagen de la moneda
if ($moneda == 1) {
$_SESSION["puntosG"] += 1;
$_SESSION["moneda"] = "<img src=\"img/a.svg\" alt=\"A\" width=\"100\" height=\"100\">";
} else {
$_SESSION["puntosM"] += 1;
$_SESSION["moneda"] = "<img src=\"img/b.svg\" alt=\"B\" width=\"100\" height=\"100\">";
}
// Calculamos la cara del gato y del mono
if ($_SESSION["puntosG"] > $_SESSION["puntosM"]) {
$_SESSION["caraG"] = "😸";
$_SESSION["caraM"] = "🙈";
} elseif ($_SESSION["puntosG"] < $_SESSION["puntosM"]) {
$_SESSION["caraG"] = "🙀";
$_SESSION["caraM"] = "🐵";
} else {
$_SESSION["caraG"] = "😼";
$_SESSION["caraM"] = "🙊";
}
} elseif ($siguiente == "Volver a empezar") {
// Si la acción es volver a empezar, destruimos la sesión
session_destroy();
}
// Volvemos a la primera página
header("Location:sesiones-2-13-1.php");
En esta solución se utilizan únicamente tres variables de sesión (el número de turnos ganados por cada jugador y quién ha ganado el turno). Eso obliga a que en la primera página se tenga que decidir los emojis y la imagen de la moneda a mostrar.
sesiones-1-13-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-13");
session_start();
// Si falta una de los dos variables de sesión, reiniciamos los valores
if (!isset($_SESSION["g"], $_SESSION["m"], $_SESSION["moneda"])) {
$_SESSION["moneda"] = 0;
$_SESSION["g"] = 0;
$_SESSION["m"] = 0;
}
?>
<!DOCTYPE html>
// ...
<table style="text-align: center;">
<tr>
<th>Jugador A</th>
<th>Resultado</th>
<th>Jugador B</th>
</tr>
<?php
// Mostramos las puntuaciones de cada jugador
print " <tr style=\"font-size: 400%\">\n";
print " <td>$_SESSION[g]</td>\n";
print " <td></td>\n";
print " <td>$_SESSION[m]</td>\n";
print " </tr>\n";
// Calculamos la cara del gato
print " <tr style=\"font-size: 400%\">\n";
if ($_SESSION["g"] > $_SESSION["m"]) {
print " <td>😸</td>\n";
} elseif ($_SESSION["g"] < $_SESSION["m"]) {
print " <td>🙀</td>\n";
} else {
print " <td>😼</td>\n";
}
// Enseñamos la moneda
if ($_SESSION["moneda"] == 0) {
print " <td></td>\n";
} elseif ($_SESSION["moneda"] == 1) {
print " <td><img src=\"img/a.svg\" alt=\"A\" width=\"100\" height=\"100\"></td>\n";
} else {
print " <td><img src=\"img/b.svg\" alt=\"B\" width=\"100\" height=\"100\"></td>\n";
}
// Calculamos la cara del mono
if ($_SESSION["g"] > $_SESSION["m"]) {
print " <td>🙈</td>\n";
} elseif ($_SESSION["g"] < $_SESSION["m"]) {
print " <td>🐵</td>\n";
} else {
print " <td>🙊</td>\n";
}
print " </tr>\n";
?>
sesiones-1-13-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-2-13");
session_start();
// Si falta una de los dos variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["g"], $_SESSION["m"], $_SESSION["moneda"])) {
header("Location:sesiones-2-13-b-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 acción
$siguiente = recoge("siguiente");
if ($siguiente == "Lanzar moneda") {
// Si la acción es lanzar la moneda ...
// Lanzamos la moneda
$_SESSION["moneda"] = rand(1, 2);
// Calculamos quién gana el turno
if ($_SESSION["moneda"] == 1) {
$_SESSION["g"] += 1;
} else {
$_SESSION["m"] += 1;
}
} elseif ($siguiente == "Volver a empezar") {
// Si la acción es volver a empezar, reiniciamos las variables de sesión
$_SESSION["moneda"] = 0;
$_SESSION["g"] = 0;
$_SESSION["m"] = 0;
}
// Volvemos a la primera página
header("Location:sesiones-2-13-b-1.php");