Ejercicios (sesiones) - Sesiones (1) - Soluciones

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

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

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

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

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.

  1. La página 1 coloca el punto rojo en el valor guardado en $_SESSION.
  2. Para que las dos páginas del programa puedan utilizar la coordenada del punto (en la página 1 el número se incluye en el dibujo y en la página 2 se modifica), guardaremos el número en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  3. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimir alguno provocaría un error. Por ello, en caso de que no exista la variable de sesión $_SESSION["numero"], redirigimos a la página 2 para que establezca su valor inicial.
  4. Para que la página 2 pueda establecer o modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si la variable de sesión $_SESSION["numero"] no está definida, establecemos su valor inicial, en este caso 0.
  6. La página 2 debe terminar redirigiendo siempre a la página 1.
  7. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 2 botones que tienen el mismo name, por lo que sólo hay que recoger un control.

    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.

  8. Dependiendo del valor recibido, aumentamos, reducimos o ponemos a cero la variable de sesión.
  9. Para que cuando el punto salga por un lado del dibujo entre por el otro, se debe comprobar si el valor supera los extremos y, en su caso, cambiarlo por el valor extremo opuesto.

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");

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

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

  1. La página 1 coloca el punto rojo mediante los dos valores guardados en $_SESSION.
  2. Para que las dos páginas del programa puedan utilizar las coordenadas del punto (en la página 1 los valores se incluyen en el dibujo y en la página 2 se modifican), guardaremos ambos números en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  3. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimir alguno provocaría un error. Por ello, en caso de que no exista cualquiera de las variables de sesión $_SESSION["x"] o $_SESSION["y"], redirigimos a la página 2 para que establezca sus valores iniciales.
  4. Para que la página 2 pueda establecer o modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  5. Si alguna variable de sesión no está definida, establecemos sus valores iniciales, en este caso 0.
  6. La página 2 debe terminar redirigiendo siempre a la página 1.
  7. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 5 botones que tienen el mismo name, por lo que sólo hay que recoger un control.

    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.

  8. En la página 2 modificamos el valor o los valores guardados en la sesión, dependiendo del valor recibido (se aumenta uno u otro, se reduce uno u otro o se ponen a cero ambos).
  9. Para que cuando el punto salga por un lado del dibujo entre por el otro, se debe comprobar si el valor supera los extremos y, en su caso, cambiarlo por el otro valor extremo.

sesiones-1-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");

Sesiones (1) 3 - Votar una opción

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

  1. La página 1 dibuja la primera barra a partir de uno de los valores guardado en $_SESSION. El valor se utiliza en dos atributos.
  2. La página 1 dibuja la segunda barra a partir del otro valor guardado en $_SESSION. El valor se utiliza en dos atributos.
  3. Los datos clave de este programa son las longitudes de las barras de colores. Para que las dos páginas del programa puedan utilizar o modificar estos valores, guardaremos ambos números en $_SESSION. Por tanto, debemos unir la página 1 a una sesión. Conviene dar nombre a la sesión para que cada ejercicio utilice su propia matriz $_SESSION distinta del resto.
  4. Cuando se abre la página 1 por primera vez, $_SESSION no contiene ningún dato e intentar imprimir alguno provocaría un error. Por ello, en caso de que no exista cualquiera de las variables de sesión $_SESSION["a"] o $_SESSION["b"], redirigimos a la página 2 para que establezca sus valores iniciales.
  5. Para que la página 2 pueda establecer o modificar los datos guardados en $_SESSION, debemos unir la página a la misma sesión que la página 1.
  6. Si alguna variable de sesión no está definida, establecemos sus valores iniciales, en este caso 0.
  7. La página 2 debe terminar redirigiendo siempre a la página 1.
  8. La página 2 debe recoger el dato enviado por el formulario de la página 1. En la página 1 hay 3 botones que tienen el mismo name, por lo que sólo hay que recoger un control.

    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.

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

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 - Hucha de monedas (ejercicio examen curso 2017/18)

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");

Sesiones (1) 5 - Cara o cruz (ejercicio examen curso 2017/18) - Solución A

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"]   = "&#128572;";
    $_SESSION["caraM"]   = "&#128586;";
}

?>
<!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"] = "&#128568;"; $_SESSION["caraM"] = "&#128584;"; } elseif ($_SESSION["puntosG"] < $_SESSION["puntosM"]) { $_SESSION["caraG"] = "&#128576;"; $_SESSION["caraM"] = "&#128053;"; } else { $_SESSION["caraG"] = "&#128572;"; $_SESSION["caraM"] = "&#128586;"; } } 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");

Sesiones (1) 5 - Cara o cruz (ejercicio examen curso 2017/18) - Solución B

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>&#128568;</td>\n";
} elseif ($_SESSION["g"] < $_SESSION["m"]) {
    print "      <td>&#128576;</td>\n";
} else {
    print "      <td>&#128572;</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>&#128584;</td>\n";
} elseif ($_SESSION["g"] < $_SESSION["m"]) {
    print "      <td>&#128053;</td>\n";
} else {
    print "      <td>&#128586;</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");

Sesiones (1) 6 - Quita cartas (ejercicio examen curso 2017/18) - Solución A

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");

Sesiones (1) 6 - Quita cartas (ejercicio examen curso 2017/18) - Solución B

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");