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).
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:
sesiones-1-01-1.php
<?php
// Accedemos a la sesión5
session_name("sesiones-1-01");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Texto 1 (Formulario)</h1>
<?php
// Si hay un texto guardado en la sesión, 6
if (isset($_SESSION["texto"])) {
// se muestra 4
print " <p>El texto es: <strong>$_SESSION[texto]</strong>.</p>\n";
print "\n";
}
?>
<form action="sesiones-1-01-2.php" method="get">
<p>Escriba texto:</p>
// ...
sesiones-1-01-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-01");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Texto 1 (Resultado)</h1>
<?php
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos el texto
$texto = recoge("texto");
// Comprobamos el texto y escribimos avisos si es necesario
if ($texto == "") {
print " <p class=\"aviso\">No ha escrito su nombre.</p>\n";
} else {2
// Si el texto es válido, guardamos el texto en la sesión ...
$_SESSION["texto"] = $texto;
// y lo mostramos
print " <p>El texto es: <strong>$texto</strong>.</p>\n";
}
?>
<p><a href="sesiones-1-01-1.php">Volver a la primera página.</a></p>
// ...
Nota: La diferencia entre las dos soluciones propuestas para este ejercicio es que la solución B sigue el procedimiento recomendado en estos apuntes de crear una variable auxiliar $xxOk por cada variable que recoge un control del formulario, mientras que la solución A no utiliza esa variable auxiliar ya que en este caso solamente se recoge un control.
Se muestra únicamente la parte de la segunda página en la que aparece la variable auxiliar $textoOk.
sesiones-1-01-b-2.php
<?php
// ...
// Recogemos el texto
$texto = recoge("texto");
$textoOk = false;
// Comprobamos el texto y escribimos avisos si es necesario
if ($texto == "") {
print " <p class=\"aviso\">No ha escrito su nombre.</p>\n";
} else {
$textoOk = true;
}
// Si el texto es válido,
if ($textoOk) {
// guardamos el texto en la sesión
$_SESSION["texto"] = $texto;
// y lo mostramos
print " <p>El texto es: <strong>$texto</strong>.</p>\n";
}
?>
<p><a href="sesiones-1-01-b-1.php">Volver a la primera página.</a></p>
// ...
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:
sesiones-1-02-1.php
<?php
// Accedemos a la sesión 8
session_name("sesiones-1-02");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Texto 2 (Formulario)</h1>
<?php
// Si hay un texto guardado en la sesión, lo mostramos 9
if (isset($_SESSION["texto"])) {
print " <p>El texto es: <strong>$_SESSION[texto]</strong>.</p>\n"; 7
print "\n";
}
?>
<form action="sesiones-1-02-2.php" method="get">
<p>Escriba texto:</p>
// ...
sesiones-1-02-2.php
<?php
// Accedemos a la sesión 5
session_name("sesiones-1-02");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos el texto
$texto = recoge("texto");
$textoOk = false;
// Comprobamos el texto
if ($texto == "") {
// Si el texto es vacío, no es correcto, pero no hacemos nada especial 2
} else {
$textoOk = true;
}
// Si el texto no es válido ...
if (!$textoOk) {
// ... volvemos al formulario 3
header("Location:sesiones-1-02-1.php");
exit;
} else {
// ... guardamos el texto en la sesión 4
$_SESSION["texto"] = $texto;
// Volvemos al formulario 6
header("Location:sesiones-1-02-1.php");
exit;
}
?>
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:
sesiones-1-02-b-1.php
<?php
// Accedemos a la sesión 1
session_name("sesiones-1-02-b");
session_start();
// Si no existe la variable de sesión, la creamos vacía 2
if (!isset($_SESSION["texto"])) {
$_SESSION["texto"] = "";
}
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Texto 2 (Formulario)</h1>
<?php// Si hay un texto no vacío guardado en la sesión, lo mostramos 3
if ($_SESSION["texto"] != "") {
print " <p>El último texto escrito es: <strong>$_SESSION[texto]</strong>.</p>\n";
print "\n";
}
?>
<form action="sesiones-1-02-b-2.php" method="get">
<p>Escriba texto:</p>
// ...
sesiones-1-02-b-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-02-b");
session_start();
// Si no existe la variable de sesión, la creamos vacía 5
if (!isset($_SESSION["texto"])) {
$_SESSION["texto"] = "";
}
// Función de recogida de datos 6
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos el texto
$texto = recoge("texto");
$textoOk = false;
// Recogemos el texto
$texto = recoge("texto");
// Comprobamos el texto
if ($texto != "") { 7
// Si el texto no es vacío, lo guardamos en la sesión
$_SESSION["texto"] = $texto;
}
header("Location:sesiones-1-02-1.php"); 8
?>
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:
sesiones-1-03-1.php
<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Palabra en mayúsculas (Formulario)</h1>
<form action="sesiones-1-03-2.php" method="get">
<?php
//Si no hemos detectado un error y hay guardada una palabra en la sesión ... 11
if (!isset($_SESSION["error"]) && isset($_SESSION["palabra"])) {
// ... mostramos la palabra
print " <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
print "\n";
}
print " <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";
// Si hemos detectado un error 9
if (isset($_SESSION["error"])) {
// Mostramos el control, añadiendo el aviso e incluyendo el valor incorrecto en el control
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" value=\"$_SESSION[palabra]\" size=\"20\" maxlength=\"20\"></label> "
. "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
print "\n";
} else {
// Si no hemos detectado un error, lo mostramos... 10
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
}
?>
// ...
sesiones-1-03-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-03");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos la palabra
$palabra = recoge("palabra");
// Guardamos la palabra en la sesión 2
$_SESSION["palabra"] = $palabra;
// Comprobamos la palabra
if ($palabra == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
$_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error 5
$_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
} else {
// Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
unset($_SESSION["error"]);
}
// Volvemos al formulario 7
header("Location:sesiones-1-03-1.php");
?>
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:
sesiones-1-03-b-1.php
<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03-b");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Palabra en mayúsculas (Formulario)</h1>
<form action="sesiones-1-03-b-2.php" method="get">
<?php
//Si hay guardada una palabra en la sesión ... 12
if (isset($_SESSION["palabra"])) {
// ... mostramos la palabra
print " <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
print "\n";
}
print " <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";
if (isset($_SESSION["error"]) && isset($_SESSION["intento"])) {
// Si hemos detectado un error y el usuario había escrito una palabra para corregir 9
// Mostramos el control, añadiendo el aviso e incluyendo el valor incorrecto en el control
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" value=\"$_SESSION[intento]\" size=\"20\" maxlength=\"20\"></label> "
. "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
print "\n";
} elseif (isset($_SESSION["error"])) {
// Si hemos detectado un error, pero no hay palabra para corregir 10
// Mostramos el control, añadiendo el aviso
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label> "
. "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
print "\n";
} else {
// Si no hemos detectado un error, mostramos simplemente el control 11
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
}
?>
// ...
sesiones-1-03-b-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-03-b");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos la palabra
$palabra = recoge("palabra");
// Borramos todos los datos anteriores 2
unset($_SESSION["intento"]);
unset($_SESSION["error"]);
unset($_SESSION["palabra"]);
// Comprobamos la palabra
if ($palabra == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
$_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 5
$_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
$_SESSION["intento"] = $palabra;
} else {
// Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
$_SESSION["palabra"] = $palabra;
}
// Volvemos al formulario 7
header("Location:sesiones-1-03-b-1.php");
?>
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:
sesiones-1-03-c-1.php
<?php
// Accedemos a la sesión 8
session_name("sesiones-1-03-c");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Palabra en mayúsculas (Formulario)</h1>
<form action="sesiones-1-03-c-2.php" method="get">
<?php
//Si hay guardada una palabra en la sesión ... 11
if (isset($_SESSION["palabra"])) {
// ... mostramos la palabra
print " <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[palabra]</strong>.</p>\n";
print "\n";
}
print " <p>Escriba una palabra en mayúsculas:</p>\n";
print "\n";
print " <p><label>Palabra: <input type=\"text\" name=\"palabra\" ";
// Si hay que incluir el intento anterior en value, lo incluimos 9
if (isset($_SESSION["intento"])) {
print "value=\"$_SESSION[intento]\" ";
}
print "size=\"20\" maxlength=\"20\"></label> ";
// Si hay que incluir un aviso, lo incluimos 10
if (isset($_SESSION["error"])) {
print "<span class=\"aviso\">$_SESSION[error]</span></p>\n";
}
print "\n";
?>
// ...
sesiones-1-03-c-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-03-c");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos la palabra
$palabra = recoge("palabra");
// Borramos todos los datos anteriores 2
unset($_SESSION["intento"]);
unset($_SESSION["error"]);
unset($_SESSION["palabra"]);
// Comprobamos la palabra
if ($palabra == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
$_SESSION["error"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($palabra)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 5
$_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
$_SESSION["intento"] = $palabra;
} else {
// Si la palabra es correcta, borramos el error anterior que pudiera haber en la sesión 6
$_SESSION["palabra"] = $palabra;
}
// Volvemos al formulario 7
header("Location:sesiones-1-03-c-1.php");
?>
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:
sesiones-1-03-d-2.php
<?php
// Accedemos a la sesión 5
session_name("sesiones-1-03-d");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos la palabra
$palabra = recoge("palabra");
// Comprobamos la palabra, guardamos el dato que queremos enseñar y borramos el resto
if ($palabra == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 2
unset($_SESSION["intento"]);
$_SESSION["error"] = "No ha escrito ninguna palabra";
unset($_SESSION["palabra"]);
} elseif (!ctype_upper($palabra)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y el intento anterior 3
$_SESSION["intento"] = $palabra;
$_SESSION["error"] = "No ha escrito la palabra en mayúsculas";
unset($_SESSION["palabra"]);
} else {
// Si la palabra es correcta, guardamos en la sesión la palabra 4
unset($_SESSION["intento"]);
unset($_SESSION["error"]);
$_SESSION["palabra"] = $palabra;
}
// Volvemos al formulario 6
header("Location:sesiones-1-03-d-1.php");
?>
Este ejercicio es parecido al anterior. La diferencia es que como hay dos controles, tenemos el doble de variables de sesión. Además, hay que tener en cuenta que si un control se escribe bien, pero el otro se escribe mal, el valor correcto se debe incluir en el control para que el usuario no lo tenga que volver a escribir.
sesiones-1-04-1.php
<?php
// Accedemos a la sesión 9
session_name("sesiones-1-04");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Palabra en mayúsculas (Formulario)</h1>
<form action="sesiones-1-04-2.php" method="get">
<?php
//Si no hemos detectado error en la palabra en mayúsculas y hay guardada una palabra en la sesión ... 14
if (!isset($_SESSION["mayusculasError"]) && !isset($_SESSION["minusculasError"])
&& isset($_SESSION["mayusculas"]) && isset($_SESSION["minusculas"]) ) {
// ... mostramos la palabra
print " <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[mayusculas]</strong>.</p>\n";
print "\n";
print " <p>Ha escrito una palabra en minúsculas: <strong>$_SESSION[minusculas]</strong>.</p>\n";
print "\n";
}
print " <p>Escriba una palabra en mayúsculas y otra en minúsculas:</p>\n";
print "\n";
// Si hemos detectado un error en la palabra en mayúsculas
if (isset($_SESSION["mayusculasError"])) {
// Escribimos un aviso e incluimos el valor incorrecto en el control 10
print " <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\"></label> "
. "<span class=\"aviso\">$_SESSION[mayusculasError]</span></p>\n";
print "\n";
} elseif (isset($_SESSION["minusculasError"])) {
// Si hemos detectado un error en la palabra en minúsculas, incluimos el valor correcto en el control 11
print " <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" value=\"$_SESSION[mayusculas]\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
} else {
// Si no hemos detectado un error, escribimos el control vacío 12
print " <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
}
// Si hemos detectado un error en la palabra en minúsculas 13
if (isset($_SESSION["minusculasError"])) {
// Escribimos un aviso e incluimos el valor incorrecto en el control
print " <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\"></label> "
. "<span class=\"aviso\">$_SESSION[minusculasError]</span></p>\n";
print "\n";
} elseif (isset($_SESSION["mayusculasError"])) {
// Si hemos detectado un error en la palabra en mayúsculas, incluimos el valor correcto en el control
print " <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" value=\"$_SESSION[minusculas]\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
} else {
// Si no hemos detectado un error, escribimos el control vacío
print " <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" size=\"20\" maxlength=\"20\"></label></p>\n";
print "\n";
}
?>
// ...
sesiones-1-04-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-04");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos las dos palabras
$mayusculas = recoge("mayusculas");
$minusculas = recoge("minusculas");
// Guardamos las palabras en la sesión 2
$_SESSION["mayusculas"] = $mayusculas;
$_SESSION["minusculas"] = $minusculas;
// Comprobamos la palabra en mayúsculas
if ($mayusculas == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
$_SESSION["mayusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($mayusculas)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error 5}
$_SESSION["mayusculasError"] = "No ha escrito la palabra en mayúsculas";
} else {
// Si la palabra es correcta, borramos los posibles errores anteriores 6
unset($_SESSION["mayusculasError"]);
}
// Comprobamos la palabra en minúsculas 7
if ($minusculas == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error
$_SESSION["minusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_lower($minusculas)) {
// Si la palabra está en mayúsculas, guardamos en la sesión el mensaje de error
$_SESSION["minusculasError"] = "No ha escrito la palabra en minúsculas";
} else {
// Si la palabra es correcta, borramos los posibles errores anteriores
unset($_SESSION["minusculasError"]);
}
// Volvemos al formulario 8
header("Location:sesiones-1-04-1.php");
?>
Como en el caso del ejercicio 3, en el que se han ofrecido varias soluciones, esta solución es algo distinta a la anterior.
sesiones-1-04-b-1.php
<?php
// Accedemos a la sesión 9
session_name("sesiones-1-04-b");
session_start();
?>
<!DOCTYPE html>
// ...
<body>
<h1>Formulario Palabra en mayúsculas (Formulario)</h1>
<form action="sesiones-1-04-b-2.php" method="get">
<?php
//Si están guardadas en la sesión las dos palabras ... 14
if (isset($_SESSION["mayusculas"]) && isset($_SESSION["minusculas"]) ) {
// ... mostramos las dos palabras
print " <p>Ha escrito una palabra en mayúsculas: <strong>$_SESSION[mayusculas]</strong>.</p>\n";
print "\n";
print " <p>Ha escrito una palabra en minúsculas: <strong>$_SESSION[minusculas]</strong>.</p>\n";
print "\n";
}
print " <p>Escriba una palabra en mayúsculas y otra en minúsculas:</p>\n";
print "\n";
print " <p><label>Mayúsculas: <input type=\"text\" name=\"mayusculas\" ";
if (isset($_SESSION["mayusculasIntento"])) {
// Si hemos detectado un intento incorrecto en la palabra en mayúsculas, incluimos el intento en el control 10
print "value=\"$_SESSION[mayusculasIntento]\" ";
} elseif (isset($_SESSION["minusculasError"]) && isset($_SESSION["mayusculas"])) {
// Si la palabra en mayúsculas es correcta, pero hemos detectado un error en la palabra en minúsculas, incluimos la palabra correcta en el control 11
print "value=\"$_SESSION[mayusculas]\" ";
}
print "size=\"20\" maxlength=\"20\"></label> ";
// Si hemos detectado un error en la palabra en mayúsculas 12
if (isset($_SESSION["mayusculasError"])) {
// Escribimos el aviso
print "<span class=\"aviso\">$_SESSION[mayusculasError]</span>";
}
print "</p>\n";
print "\n";
print " <p><label>Minúsculas: <input type=\"text\" name=\"minusculas\" ";
if (isset($_SESSION["minusculasIntento"])) {
// Si hemos detectado un intento incorrecto en la palabra en minúsculas, incluimos el intento en el control 13
print "value=\"$_SESSION[minusculasIntento]\" ";
} elseif (isset($_SESSION["mayusculasError"]) && isset($_SESSION["minusculas"])) {
// Si la palabra en minúsculas es correcta, pero hemos detectado un error en la palabra en mayúsculas, incluimos la palabra correcta en el control
print "value=\"$_SESSION[minusculas]\" ";
}
print "size=\"20\" maxlength=\"20\"></label> ";
// Si hemos detectado un error en la palabra en minúsculas
if (isset($_SESSION["minusculasError"])) {
// Escribimos el aviso
print "<span class=\"aviso\">$_SESSION[minusculasError]</span>";
}
print "</p>\n";
print "\n";
?>
// ...
sesiones-1-04-b-2.php
<?php
// Accedemos a la sesión 3
session_name("sesiones-1-04-b");
session_start();
// Función de recogida de datos 1
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos las dos palabras
$mayusculas = recoge("mayusculas");
$minusculas = recoge("minusculas");
// Borramos los valores anteriores 2
session_unset();
// Comprobamos la palabra en mayúsculas
if ($mayusculas == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error 4
$_SESSION["mayusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_upper($mayusculas)) {
// Si la palabra está en minúsculas, guardamos en la sesión el mensaje de error y la palabra 5
$_SESSION["mayusculasIntento"] = $mayusculas;
$_SESSION["mayusculasError"] = "No ha escrito la palabra en mayúsculas";
} else {
// Si la palabra es correcta, guardamos en la sesión la palabra 6
$_SESSION["mayusculas"] = $mayusculas;
}
// Comprobamos la palabra en minúsculas 7
if ($minusculas == "") {
// Si no se recibe palabra, guardamos en la sesión el mensaje de error
$_SESSION["minusculasError"] = "No ha escrito ninguna palabra";
} elseif (!ctype_lower($minusculas)) {
// Si la palabra está en mayúsculas, guardamos en la sesión el mensaje de error y la palabra
$_SESSION["minusculasIntento"] = $minusculas;
$_SESSION["minusculasError"] = "No ha escrito la palabra en minúsculas";
} else {
// Si la palabra es correcta, guardamos en la sesión la palabra
$_SESSION["minusculas"] = $minusculas;
}
// Volvemos al formulario 8
header("Location:sesiones-1-04-1.php");
?>
Es importante recordar que el usuario sólo va a ver la página 1 del programa, ya que la página 2 va a redirigir siempre automáticamente a la página 1. Por ello, la página 2 no debe tener ningún fragmento de HTML, ni ningún print.
Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato
sesiones-1-11-1.php
<?php
// Accedemos a la sesión 1
session_name("sesiones-1-11");
session_start();
// Si el número no está guardado en la sesión, ponemos el valor a cero
if (!isset($_SESSION["numero"])) {2
$_SESSION["numero"] = 0;
}
?>
<!DOCTYPE html>
// ...
<p>
<button type="submit" name="accion" value="bajar" style="font-size: 4rem">-</button>
<?php
// Mostramos el número, guardado en la sesión 3
print " <span style=\"font-size: 4rem\">$_SESSION[numero]</span>\n";
?>
<button type="submit" name="accion" value="subir" style="font-size: 4rem">+</button>
</p>
// ...
sesiones-1-11-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-11");
session_start();
// Si el número no está guardado en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["numero"])) {
header("Location:sesiones-1-11-1.php");
exit;
}
// Función de recogida de datos 6
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos accion
$accion = recoge("accion");
// Dependiendo de la acción recibida, modificamos el número guardado 7
if ($accion == "cero") {
$_SESSION["numero"] = 0;
} elseif ($accion == "subir") {
$_SESSION["numero"]++;
} elseif ($accion == "bajar") {
$_SESSION["numero"]--;
}
// Volvemos al formulario 8
header("Location:sesiones-1-11-1.php");
Este ejercicio es muy similar al anterior: mediante dos botones se aumenta o disminuye un valor. La diferencia es que en este ejercicio el valor no se muestra, pero se utiliza para situar un punto en una línea.
Como en cualquier página que recibe un control de un formulario, añadimos la función recoge() y definimos una variable para recoger el dato
sesiones-1-12-1.php
<?php
// Accedemos a la sesión 1
session_name("sesiones-1-12");
session_start();
// Si la posición no está guardada en la sesión, ponemos el valor a cero 2
if (!isset($_SESSION["posicion"])) {
$_SESSION["posicion"] = 0;
}
?>
<!DOCTYPE html>
// ...
<line x1=\"-300\" y1=\"10\" x2=\"300\" y2=\"10\" stroke=\"black\" stroke-width=\"5\" />
<?php
// Dibujamos el círculo en su posición 3
print " <circle cx=\"$_SESSION[posicion]\" cy=\"10\" r=\"8\" fill=\"red\" />\n";
?>
</svg>
// ...
sesiones-1-12-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-12");
session_start();
// Si la posición no está guardada en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["posicion"])) {
header("Location:sesiones-1-12-1.php");
exit;
}
// Función de recogida de datos 6
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos accion
$accion = recoge("accion");
// Dependiendo de la acción recibida, modificamos el número guardado 7
if ($accion == "centro") {
$_SESSION["posicion"] = 0;
} elseif ($accion == "izquierda") {
$_SESSION["posicion"] -= 20;
} elseif ($accion == "derecha") {
$_SESSION["posicion"] += 20;
}
// Si el punto sale por un lado, entra por el otro 8
if ($_SESSION["posicion"] > 300) {
$_SESSION["posicion"] = -300;
} elseif ($_SESSION["posicion"] < -300) {
$_SESSION["posicion"] = 300;
}
// Volvemos al formulario 9
header("Location:sesiones-1-12-1.php");
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 dato
sesiones-1-13-1.php
<?php
// Accedemos a la sesión 1
session_name("sesiones-1-13");
session_start();
// Si alguna posición no está guardada en la sesión, ponemos los dos valores a cero 2
if (!isset($_SESSION["x"]) || !isset($_SESSION["y"])) {
$_SESSION["x"] = $_SESSION["y"] = 0;
}
?>
<!DOCTYPE html>
// ...
<td>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
width="400" height="400" viewBox="-200 -200 400 400" style="border: black 2px solid">
<?php
// Dibujamos el círculo en su posición 3
print " <circle cx=\"$_SESSION[x]\" cy=\"$_SESSION[y]\" r=\"8\" fill=\"red\" />\n";
?>
</svg>
</td>
// ...
sesiones-1-13-2.php
<?php
// Accedemos a la sesión 4
session_name("sesiones-1-13");
session_start();
// Si alguna posición no está guardada en la sesión, redirigimos a la primera página 5
if (!isset($_SESSION["x"]) || !isset($_SESSION["y"])) {
header("Location:sesiones-1-13-1.php");
exit;
}
// Función de recogida de datos 6
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos accion
$accion = recoge("accion");
// Dependiendo de la acción recibida, modificamos el número guardado 7
if ($accion == "centro") {
$_SESSION["x"] = $_SESSION["y"] = 0;
} elseif ($accion == "izquierda") {
$_SESSION["x"] -= 20;
} elseif ($accion == "derecha") {
$_SESSION["x"] += 20;
} elseif ($accion == "arriba") {
$_SESSION["y"] -= 20;
} elseif ($accion == "abajo") {
$_SESSION["y"] += 20;
}
// Si el punto sale por la izquierda o la derecha, entra por el otro lado 8
if ($_SESSION["x"] > 200) {
$_SESSION["x"] = -200;
} elseif ($_SESSION["x"] < -200) {
$_SESSION["x"] = 200;
}
// Si el punto sale por arriba o por abajo, entra por el otro lado
if ($_SESSION["y"] > 200) {
$_SESSION["y"] = -200;
} elseif ($_SESSION["y"] < -200) {
$_SESSION["y"] = 200;
}
// Volvemos al formulario 9
header("Location:sesiones-1-13-1.php");
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 dato
sesiones-1-14-1.php
<?php
// Accedemos a la sesión 1
session_name("sesiones-1-14");
session_start();
// Si algún contador no está guardado en la sesión, ponemos ambos a cero 2
if (!isset($_SESSION["a"]) || !isset($_SESSION["b"])) {
$_SESSION["a"] = $_SESSION["b"] = 0;
}
?>
<!DOCTYPE html>
// ...
<tr>
<td style="vertical-align: top;"><button type="submit" name="accion" value="a" style="font-size: 60px; line-height: 50px; color: hwb(200 0% 0%);">✔</button></td>
<td>
<?php
// Dibujamos la primera barra 3
print " <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print " width=\"$_SESSION[a]\" height=\"50\">\n";
print " <line x1=\"0\" y1=\"25\" x2=\"$_SESSION[a]\" y2=\"25\" stroke=\"hwb(200 0% 0%)\" stroke-width=\"50\" />\n";
print " </svg>\n";
?>
</td>
<tr>
<td><button type="submit" name="accion" value="b" style="font-size: 60px; line-height: 50px; color: hwb(35 0% 0%)">✔</button></td>
<td>
<?php
// Dibujamos la segunda barra 4
print " <svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" \n";
print " width=\"$_SESSION[b]\" height=\"50\">\n";
print " <line x1=\"0\" y1=\"25\" x2=\"$_SESSION[b]\" y2=\"25\" stroke=\"hwb(35 0% 0%)\" stroke-width=\"50\" />\n";
print " </svg>\n";
?>
</td>
</tr>
</table>
// ...
sesiones-1-14-2.php
<?php
// Accedemos a la sesión 5
session_name("sesiones-1-14");
session_start();
// Si alguno de los números de votos no está guardado en la sesión, ponemos ambos a cero 6
if (!isset($_SESSION["a"]) || !isset($_SESSION["b"])) {
$_SESSION["a"] = $_SESSION["b"] = 0;
}
// Función de recogida de datos 7
function recoge($key, $type = "")
{
if (!is_string($key) && !is_int($key) || $key == "") {
trigger_error("Function recoge(): Argument #1 (\$key) must be a non-empty string or an integer", E_USER_ERROR);
} elseif ($type !== "" && $type !== []) {
trigger_error("Function recoge(): Argument #2 (\$type) is optional, but if provided, it must be an empty array or an empty string", E_USER_ERROR);
}
$tmp = $type;
if (isset($_REQUEST[$key])) {
if (!is_array($_REQUEST[$key]) && !is_array($type)) {
$tmp = trim(htmlspecialchars($_REQUEST[$key]));
} elseif (is_array($_REQUEST[$key]) && is_array($type)) {
$tmp = $_REQUEST[$key];
array_walk_recursive($tmp, function (&$value) {
$value = trim(htmlspecialchars($value));
});
}
}
return $tmp;
}
// Recogemos accion
$accion = recoge("accion");
// Dependiendo de la acción recibida, modificamos el número correspondiente 8
if ($accion == "a") {
$_SESSION["a"] += 10;
} elseif ($accion == "b") {
$_SESSION["b"] += 10;
} elseif ($accion == "cero") {
$_SESSION["a"] = $_SESSION["b"] = 0;
}
// Volvemos al formulario 9
header("Location:sesiones-1-14-1.php");
?>