A practicar

A practicar con formularios avanzados

A practicar Desarrollo

Volvemos con la serie A practicar… en la cual, en esta ocasión, vamos a practicar con formularios avanzados. Hemos visto cómo controlar la seguridad en los formularios, también la validación y, por último, cómo subir archivos. Estamos preparados para practicar con formularios avanzados en donde tendremos en cuenta todas estas cosas.

Pero, antes de practicar con formularios avanzados, vayamos a resolver el reto del anterior artículo.

Solución al reto anterior

Buscábamos crear una página web completa en la que colocáramos un formulario para, posteriormente en nuestro archivo PHP, resolver ecuaciones de primer o segundo grado. En primer lugar veamos el código fuente del archivo ecuacion.html:

<!DOCTYPE html>
<html>
<head>
	<title>Ecuación</title>
	<meta charset="utf-8">
</head>
<body>
	<h1>Programa de resolución de ecuaciones</h1>
	<form action="resolviendo.php" method="post">
	  <p>Introduce tu nombre: <input type="text" name="nombre" required></p>
	  <p>Elige el tipo de ecuación a resolver: <select name="tipo">
	  	<option value="primer">Primer grado</option>
	  	<option value="segundo">Segundo grado</option>
	  </select></p>
	  <p>Introduce el valor de a: <input type="number" name="a" required></p>
	  <p>Introduce el valor de b: <input type="number" name="b" required></p>
	  <p>Introduce el valor de c: <input type="number" name="c"></p>
	  <input type="submit" value="Resolver">
	</form>
</body>
</html>

En primer lugar, tenemos nuestra página bien construida, con su etiqueta <html>, sus cabeceras en <head> en el que está el <title> de la página y luego el contenido dentro del <body>. Dentro del contenido hemos colocado un título en <h1> para que destaque más.

A continuación tenemos el formulario, el cual llamará al action con el archivo resolviendo.php utilizando el método post, aunque estará igualmente bien si utilizamos get (pero habría que tenerlo en cuenta en PHP luego). Nuestro formulario tiene un <input> de tipo text para obtener el nombre, un <select> con las opciones necesarias para escoger si queremos resolver la ecuación de primer o segundo grado, y luego tres <input> de tipo number para introducir los valores de a, b y c. Finalmente un <input> de tipo submit para enviar el formulario.

El archivo PHP resolviendo.php

Nuestro archivo PHP será donde realicemos todas las operaciones para mostrar finalmente la solución encontrada. Vamos a ver cada una de las dos funciones y luego una implementación que obtenga los datos y llame a estas funciones.

Función para resolver la ecuación de primer grado

function resuelvePrimerGrado($a, $b) {
	if ($a != 0) {
		$x = -$b / $a;
		echo 'La solución de la ecuación es x = ' . $x;
	} else {
		if ($b != 0) {
			echo 'La ecuación no tiene solución';
		} else {
			echo 'La ecuación tiene infinitas soluciones';
		}
	}
}

Para resolver la ecuación de primer grado solo necesitamos los dos primeros valores, en este caso $a y $b. Ya vimos en su momento un algoritmo de resolución de ecuaciones de primer grado. Si $a es distinto de cero, entonces la solución es -$b / $a. Pero si $a es cero, entonces puede que la ecuación no tenga solución porque $b es distinto de cero (se produciría una división por cero), o que tenga infinitas soluciones si es igual a cero. Al final, son los tres mensajes que imprimimos en cada caso.

Función para resolver la ecuación de segundo grado

function resuelveSegundoGrado($a, $b, $c) {
	if ($a != 0) {
		$disciminante = ($b ** 2) - 4 * $a * $c;
		
		if ($disciminante >= 0) {
			$x1 = (-$b + sqrt($disciminante)) / (2 * $a);
			$x2 = (-$b - sqrt($disciminante)) / (2 * $a);

			if ($x1 == $x2) {
				echo 'La solución de la ecuación es x = ' . $x1;
			} else {
				echo 'Las soluciones de la ecuación son x1 = ' . $x1 . ' y x2 = ' . $x2;
			}
		} else {
			echo 'No hay soluciones reales';
		}
	} else {
		resuelvePrimerGrado($b, $c);
	}
}

Varias cosas que comentar aquí. Empecemos por el final precisamente. ¿Qué pasa si $a es igual a cero? Sólo tenemos los valores de $b y $c y esto equivale a tener una ecuación de primer grado. Así pues, en lugar de volver a copiar el código de resolución de ecuaciones de primer grado, ¡reutilizamos la función que ya hemos definido! Es una estupenda forma de reutilizar código y hacer más legibles, sencillos y eficientes nuestros programas. Además, si hubiéramos cometido un error en el código de la función de primer grado, con arreglarlo una vez sería suficiente.

Pero vamos con la situación en que $a es distinto de cero y pasemos a resolver la ecuación. Primero calculamos el $discriminante, que es, si recordamos la fórmula para resolver ecuaciones de segundo grado, lo que hay dentro de la raíz y que es b2 – 4ac. Si este valor fuera menor que 0, entonces tendríamos una raíz negativa, por lo que no hay soluciones reales (entrarían números imaginarios y tal…), que es lo que indicamos.

Si no es así, calculamos los dos posibles valores de la solución, el primero con la suma y el segundo con la resta, en base a la conocida fórmula. Fijáos que hemos utilizado la función predefinida sqrt para calcular la raíz cuadrada.

Finalmente un detalle más. Si los dos valores son iguales, entonces no hace falta que mostremos que la solución es 4 y 4, por ejemplo. Con decir que la solución es 4 nos vale, así que el mensaje a imprimir dependerá de ello. Solo si son distintos los dos valores, imprimimos las dos soluciones, la de x1 y la de x2.

Recogida de datos e implementación

$nombre = $_POST['nombre'];

$a = $_POST['a'];
$b = $_POST['b'];
$c = $_POST['c'];

$tipo = $_POST['tipo'];

echo 'Hola ' . $nombre . '<br><br>';
if ($tipo === 'primer') {
	resuelvePrimerGrado($a, $b);
} elseif ($tipo === 'segundo') {
	resuelveSegundoGrado($a, $b, $c);
}

Definidas las dos funciones, solo bastará recoger los datos y llamar a esas funciones. Primero recogemos el nombre con $_POST[‘nombre’] recordando que nombre era el valor del atributo name en el <input> correspondiente. Luego recogemos los valores de a, b y c para, por último, recoger el tipo que venía de la opción escogida en el <select>.

Cuando los tenemos, mostramos por cortesía un mensaje saludando, ya que tenemos el nombre. Y luego, dependiendo de si el usuario ha escogido resolver una ecuación de primer o de segundo grado, llamamos a la función correspondiente.

Y no hay más, ha sido bastante más fácil de lo que podría parecer, así que ahora solo quedará probar el programa con algunos valores y ya estaremos listos para practicar con formularios avanzados.

Siguiente reto

El siguiente reto va a utilizar la validación y comprobación de datos. No vamos a practicar la subida de imágenes debido a que su artículo es bastante claro y sería prácticamente una mera repetición del código allí mostrado. Por ello, vamos a practicar con un pequeño programita que será el siguiente:

A practicar 2.0.2

Se busca crear una función para validar un nombre propio y que luego se utilice para obtener la información desde un sencillo formulario de contacto. Por tanto, se pide hacer lo indicado a continuación.

Crear una función validarNombre que aplique alguno o algunos de los protocolos de seguridad indicados, que compruebe si no se ha introducido ningún nombre y que compruebe, palabra a palabra, que todas empiezan con mayúsculas y que todas contienen únicamente letras (permitidas las acentuadas y eñe).

La función debe crear u obtener un array de errores e ir incorporando mensajes textuales si encuentra nuevos errores para, finalmente, devolver ese array cuyos elementos serán los errores encontrados. Eso significa que, si el array está vacío, no habrá errores y el nombre será correcto.

Crear un pequeño formulario que pida al usuario un nombre desde un campo de tipo texto. Para comprobar el funcionamiento de la función correctamente, se pide que no se incluya el atributo required en el <input> correspondiente.

Finalmente, comprobar en el mismo archivo que el formulario se envió y validar el nombre enviado. Si hay errores, se mostrarán por pantalla uno a uno. Si no hay errores, se mostrará un mensaje indicando que el nombre ha sido válido.

Utiliza el servidor local que ya deberíais tener todos instalado y en funcionamiento. Y seguid probando cosas para practicar con formularios avanzados. Dentro de dos semanas, la resolución del reto.

Deja una respuesta