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.
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).
Este ejercicio es muy similar al del ejemplo de la lección Arquitectura de dos niveles: 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.
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 control.
sesiones-1-1-1.php
<?php
// Accedemos a la sesión 2
session_name("sesiones-1-1");
session_start();
// Si la posición no está guardada en la sesión, redirigimos a la segunda página 3
if (!isset($_SESSION["posicion"])) {
header("Location:sesiones-1-1-2.php");
exit;
}
?>
<!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 1
print " <circle cx=\"$_SESSION[posicion]\" cy=\"10\" r=\"8\" fill=\"red\" />\n";
?>
</svg>
// ...
sesiones-1-1-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-11");
session_start();
// Si la posición no está guardada en la sesión, ponemos el valor a cero 5
if (!isset($_SESSION["posicion"])) {
$_SESSION["posicion"] = 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 guardado 8
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 9
if ($_SESSION["posicion"] > 300) {
$_SESSION["posicion"] = -300;
} elseif ($_SESSION["posicion"] < -300) {
$_SESSION["posicion"] = 300;
}
// Volvemos al formulario 6
header("Location:sesiones-1-1-1.php");
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.
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 control.
sesiones-1-2-1.php
<?php
// Accedemos a la sesión 2
session_name("sesiones-1-2");
session_start();
// Si alguna posición no está guardada en la sesión, redirigimos a la segunda página 3
if (!isset($_SESSION["x"], $_SESSION["y"])) {
header("Location:sesiones-1-2-2.php");
exit;
}
?>
<!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 1
print " <circle cx=\"$_SESSION[x]\" cy=\"$_SESSION[y]\" r=\"8\" fill=\"red\" />\n";
?>
</svg>
</td>
// ...
sesiones-1-2-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-2");
session_start();
// Si alguna posición no está guardada en la sesión, ponemos los dos valores a cero 5
if (!isset($_SESSION["x"], $_SESSION["y"])) {
$_SESSION["x"] = $_SESSION["y"] = 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 guardado 8
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 9
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 6
header("Location:sesiones-1-2-1.php");
Este ejercicio es muy similar al anterior. La diferencia es que cada valor se utiliza en un dibujo distinto.
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 control.
sesiones-1-3-1.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-3");
session_start();
// Si algún contador no está guardado en la sesión, redirigimos a la segunda página 4
if (!isset($_SESSION["a"], $_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 1
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 2
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-3-2.php
<?php
// Accedemos a la sesión 5
session_name("sesiones-1-3");
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"], $_SESSION["b"])) {
$_SESSION["a"] = $_SESSION["b"] = 0;
}
// Función de recogida de datos 8
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 9
if ($accion == "a") {
$_SESSION["a"] += 10;
} elseif ($accion == "b") {
$_SESSION["b"] += 10;
} elseif ($accion == "cero") {
$_SESSION["a"] = $_SESSION["b"] = 0;
}
// Volvemos al formulario 7
header("Location:sesiones-1-3-1.php");
?>
sesiones-1-4-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-4-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-4-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-4-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-1-4-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 vaciar 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-1-4-1.php");
En esta solución se utilizan cinco variables de sesión (el número de rondas ganadas 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-5-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-5");
session_start();
// Si falta una de las tres 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-5-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-5");
session_start();
// Si falta una de las tres variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["puntosG"], $_SESSION["puntosM"], $_SESSION["moneda"])) {
header("Location:sesiones-1-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 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 la ronda 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-1-5-1.php");
En esta solución se utilizan únicamente tres variables de sesión (el número de rondas ganadas por cada jugador y quién ha ganado la ronda). 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-5-b-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-5-b");
session_start();
// Si falta una de las tres 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-5-b-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-5-b");
session_start();
// Si falta una de las tres variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["g"], $_SESSION["m"], $_SESSION["moneda"])) {
header("Location:sesiones-1-5-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 la ronda
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-1-5-b-1.php");
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-6-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-6");
session_start();
// Si falta una de las 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"];
print "\n";
?>
<form action="sesiones-1-6-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-6-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-6");
session_start();
// Si falta una de las dos variables de sesión, redirigimos a la primera página
if (!isset($_SESSION["cartas"], $_SESSION["mensaje"])) {
header("Location:sesiones-1-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 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-1-6-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-6-b-1.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-6-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";
print "\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";
print "\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";
print "\n";
}
?>
<form action="sesiones-1-6-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-6-b-2.php
<?php
// Accedemos a la sesión
session_name("sesiones-1-6-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-1-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 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-1-6-b-1.php");