Foros del Web » Programando para Internet » PHP »

Mejor forma de validar formuario

Estas en el tema de Mejor forma de validar formuario en el foro de PHP en Foros del Web. Buenas a todos, me encuentro con un dilema el cual mi opción no creo que sea la más eficiente para realizar la validación. Mi opción ...
  #1 (permalink)  
Antiguo 29/07/2014, 13:32
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Mejor forma de validar formuario

Buenas a todos, me encuentro con un dilema el cual mi opción no creo que sea la más eficiente para realizar la validación.

Mi opción es la siguiente:

Código PHP:
Ver original
  1. if($_POST["edad"] == "0" or $_POST["altura"] == "0" or $_POST["peso"] == "0" or $_POST["genero"] == "" or $_POST["fumar"] == "" or $_POST["beber"] == ""
  2. or $_POST["drogas"] == "" or $_POST["alimentacion"] == "" or $_POST["ejercicio"] == "") {
  3.  // Muestro formulario otra vez diciendo que falta algo por responder
  4. } else {
  5. // Ejecuta y envia el formulario }

El caso es que uso dos páginas, la del formulario y donde ejecuta ese formulario, y me encuentro con que he puesto 2 veces el código del funcionario, que no es corto que digamos, y me queda demasiado código y la picha echa un lio.

La estructura la tengo así

index.php
Muestra el formulario.

resultado.php
En caso de que no estén los datos rellenos muestra otra vez el formulario diciendo que falta algo por rellenar. En caso de que esté bien relleno lo envia.

Esto es una práctica normal ?? puedo reutilizar código ? ¿ Como lo hariáis vosotros ?

Un saludo y gracias.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #2 (permalink)  
Antiguo 29/07/2014, 13:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mejor forma de validar formuario

Es buena practica, además de mostrar el formulario de nuevo indicar qué campos están mal y también mantener los datos previamente introducidos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 29/07/2014, 14:04
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Pues algo hago mal ya que algo va mal.

Si rellenan bien el formulario va bien. si lo rellenan mal, aparece que falta algo por rellenar. hast ahí bien, pero ya no se encuentran en el index.php si no en validado.php que es donde estaba probandolo, y si ahi lo rellenan bien, ya no funciona..
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #4 (permalink)  
Antiguo 29/07/2014, 16:37
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Mejor forma de validar formuario

Seguramente (es lo más probable) estás redireccionando hacia 'validado.php' en lugar de hacia 'index.php' y si llenando los datos en el formulario de 'validado.php' no funciona bien, entonces la falla la tienes en dicho archivo.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 29/07/2014, 17:45
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Mejor forma de validar formuario

El index (o la pagina que sea) podría contener tanto el formulario como la validación, algo así:

Código PHP:
Ver original
  1. if(isset($_POST['enviar'])
  2.   //realizar validaciones.
  3.  
  4. //...código del formulario, donde en los values e podría indicar el valor obtenido por post, para el caso de fallo.
  #6 (permalink)  
Antiguo 29/07/2014, 18:09
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

El action de index.php redirecciona a validado.php, si todo va bien envia la información, si va mal, validado.php muestra el formulario que tiene un action a validado.php también, ya que ahí se utiliza la información
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #7 (permalink)  
Antiguo 29/07/2014, 18:24
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Lo estoy probando @ocp001a

Código PHP:
Ver original
  1. if(isset($_POST['enviar'])) {
  2. // codigo php
  3. } else {
  4. //formulario
  5. }

Pero cuando envio el formulario no hace absolutamente nada, no salta ningun error, si no que parece que no haga nada.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #8 (permalink)  
Antiguo 29/07/2014, 18:33
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

La mejor forma de validar un formulario es incluir validaciones y mensajes en Javascript, igual que en PHP.

El algoritmo más común es:

Código PHP:
Ver original
  1. <?php
  2. // Inicialización de variables
  3. $nombre = '';
  4. $edad = '';
  5. $errores = array();
  6. // .........
  7.  
  8. // Verificar si se va a procesar el formulario
  9. if(isset($_POST['nombre'])) {
  10.         // Asignación desde $_POST
  11.         $nombre = htmlentities(trim($_POST['nombre']));
  12.         $edad = intval($_POST['edad']);
  13.         // .............
  14.  
  15.         // Validación de datos
  16.         if(strlen($nombre) < 3) {
  17.                 $errores['nombre'] = 'Teclea tu nombre, usando 3 o más caracteres';
  18.         }
  19.         if($edad < 5) {
  20.                 $errores['edad'] = '¿En serio sabes escribir sin haber cumplido 5 años?';
  21.         }
  22.         // ...............
  23.  
  24.         if(count($errores) = 0) {
  25.                // Aquí procesas el formulario
  26.         }
  27. }
  28. // Aquí va el formulario:
  29. ?>
  30. <form method="post" action="index.php">
  31. Nombre: <input type="text" name="nombre" value="<?php echo $nombre; ?>" /><br />
  32. <?php
  33. if(isset($errores['nombre'])) {
  34.        echo $errores['nombre'];
  35. }
  36. ?>
  37. </form>

Harías algo similar para todos los campos.

Ese sería el flujo a seguir para poder mantener valores. Si programas con algún patrón como MVC solo se necesitarían algunas adaptaciones; igual si prefieres usar variables de sesión para mantener los valores; eso ya es cosa de gustos.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 29/07/2014, 20:15
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Lo siento @triby pero con el ejemplo que me has puesto no me entero al pasarlo a mi código.

Pongo un trozo de formulario que tengo, que creo que si lo consigo con este trozo podré conseguirlo con todo lo demás.

Código PHP:
Ver original
  1. <FORM METHOD="POST" ACTION="" ENCTYPE="x-www-form-urlencoded">
  2.         <h3><terror>Sobre tu físico</terror></h3><br/>
  3.         <table border="0" align="left">
  4.             <tr>
  5.             <td><enun>Edad</enun></td>
  6.             <td><SELECT name="edad">
  7.                 <OPTION VALUE="0">0</OPTION>
  8.             <?php
  9.                 for($i=14;$i<=100;$i++) {
  10.                     echo "<OPTION VALUE=\"$i\">$i</OPTION>";
  11.                 }
  12.                 ?>
  13.             </SELECT></td>
  14.             </tr>
  15.             <tr>
  16.                 <td><enun>Altura</enun></td>
  17.                 <td><SELECT name="altura">
  18.                     <OPTION VALUE="0">0</OPTION>
  19.                 <?php
  20.                     for($i=130;$i<=250;$i++) {
  21.                         echo "<OPTION VALUE=\"$i\">$i cm</OPTION>";
  22.                     }
  23.                     ?>
  24.                     </SELECT></td>
  25.             </tr>
  26.             <tr>
  27.                 <td><enun>Peso</enun></td>
  28.                 <td><SELECT name="peso">
  29.                     <OPTION VALUE="0">0</OPTION>
  30.                 <?php
  31.                     for($i=30;$i<=200;$i++) {
  32.                         echo "<OPTION VALUE=\"$i\">$i kg</OPTION>";
  33.                     }
  34.                     ?>
  35.                     </SELECT></td>
  36.             </tr>
  37.             <tr>
  38.                 <td><enun>Género</enun></td>
  39.                 <td><INPUT type=radio name="genero" value="masculino">Masculino
  40.                     <INPUT type=radio name="genero" value="femenino">Femenino</td>
  41.             </tr>
  42.         </table>
  43.         <input type="submit" class="button" />

En caso de que cualquiera de los select esté a 0, y que los radio no estén definidos, muestre que faltan datos y cual.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #10 (permalink)  
Antiguo 29/07/2014, 22:15
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Primero que nada: Todas las etiquetas y atributos HTML deben estar en minúsculas.

Un ejemplo con tu código (se me olvidó agregar la altura):
Código PHP:
Ver original
  1. <?php
  2. // Una función útil para crear selects
  3. function html_select($name, $id, $value, $options = array(), $start = 0, $end = 0) {
  4.     echo "<select name=\"$name\" id=\"$id\">\n";
  5.     if(count($options) == 0) {
  6.         // Creamos el array con inicio y fin
  7.         if($start > 0) {
  8.             // Agregamos opción cero
  9.             $options[0] = 'Selecciona...';
  10.         }
  11.         for($i = $start; $i <= $end; $i++) {
  12.             $options[$i] = $i;
  13.         }
  14.     }
  15.     // Agregamos las opciones
  16.     foreach($options as $key => $val) {
  17.         // Para establecer la opción preseleccionada
  18.         $selected = ($key == $value) ? ' selected="selected"' : '';
  19.         echo "\t<option value=\"$key\"$sel>$val</option>\n";
  20.     }
  21.     echo "</select>\n";
  22. }
  23. // Primero los valores iniciales
  24. $edad = 0;
  25. $peso = 0;
  26. $genero = "";
  27. $errores = array();
  28.  
  29. if(isset($_POST['edad'])) {
  30.     $edad = intval($_POST['edad']);
  31.     $peso = intval($_POST['peso']);
  32.     $genero = $_POST['genero'];
  33.     // Validamos con los límites propuestos
  34.     if($edad < 14 || $edad > 100) {
  35.         $errores['edad'] = 'Selecciona tu edad';
  36.     }
  37.     if($peso < 30 || $peso > 200) {
  38.         $errores['peso'] = 'Selecciona tu peso';
  39.     }
  40.     if(!in_array($genero, array('masculino', 'femenino'))) {
  41.         $errores['genero'] = 'Selecciona tu género';
  42.     }
  43.     if(count($errores) = 0) {
  44.         // OK, todo bien, aquí terminas de procesar
  45.     }
  46.     // Si hubo errores se mostrará nuevamente el formulario
  47. }
  48. ?>
  49.         <form method="post" action="index.php" enctype="x-www-form-urlencoded">
  50.             <h3><terror>Sobre tu físico</terror></h3><br/>
  51.             <table border="0" align="left">
  52.                 <tr>
  53.                 <td><enun>Edad</enun></td>
  54.                 <td>
  55. <?php
  56. // Crear select con opción predefinida
  57. html_select('edad', 'edad', $edad, array(), 14, 100);
  58. if(isset($errores['edad'])) {
  59.     echo "<span class=\"error\">{$errores['edad']}</span>";
  60. }
  61. ?>
  62.                 </td>
  63.                 </tr>
  64.                 <tr>
  65.                     <td><enun>Peso</enun></td>
  66.                     <td>
  67. <?php
  68. // Crear select con opción predefinida
  69. html_select('peso', 'peso', $peso, array(), 30, 200);
  70. if(isset($errores['peso'])) {
  71.     echo "<span class=\"error\">{$errores['peso']}</span>";
  72. }
  73. ?>
  74.                     </td>
  75.                 </tr>
  76.                 <tr>
  77.                     <td><enun>Género</enun></td>
  78.                     <td>
  79. <?php
  80. // Crear select con opción predefinida
  81. html_select('genero', 'genero', $genero, array("" => 'Selecciona', 'masculino' => 'Masculino', 'femenino' => 'Femenino'));
  82. if(isset($errores['genero'])) {
  83.     echo "<span class=\"error\">{$errores['genero']}</span>";
  84. }
  85. ?>
  86.                     </td>
  87.                 </tr>
  88.             </table>
  89.             <input type="submit" value="Enviar" class="button" />
  90.         </form>
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 30/07/2014, 07:58
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Gracias @triby, funciona muy bien.

Está muy bien crear el formulario por medio de una función, deja el código más limpio la verdad. Por otro lado, cuando todo está correcto y tiene que procesar el formulario, aun procesándolo aparece el formulario abajo.

He probado metiendole un else a

Código PHP:
Ver original
  1. if(isset($_POST['edad'])) {
  2. // validación
  3. } else {
  4. // aquí muestra formulario
  5. }

Y ahora si lo rellenas todo procesa el formulario, muestra el echo y nada más, hasta ahí bien. Pero en cambio si falta algo por rellenar, no muestra el formulario con el error. si no que la página se queda en blanco.

Ni una ni otra. Que lio!!!
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #12 (permalink)  
Antiguo 30/07/2014, 15:04
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Es que debes detener el flujo del script; en la parte donde revisas que no hay errores:

Código PHP:
Ver original
  1. if(count($errores) = 0) {
  2.         // OK, todo bien, aquí terminas de procesar
  3.         // Debes mostrar mensaje, opciones para compartir, etc.
  4.         // Finalizas la ejecución con exit o die()
  5.         exit;
  6.     }
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 30/07/2014, 15:51
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Ahora si que si @Triby, Mil gracias, voy a intentar ahora modificar y añadir los radio que tengo en el formulario entero, ya que con select lo tengo claro, crearé la función para los radio y a ver que pasa. Si no lo consigo seguiré este tema si no es molestia. Mil gracias.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #14 (permalink)  
Antiguo 31/07/2014, 06:58
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Perdonen de nuevo.

He añadido el código para procesar el formulario y realizar las operaciones que hago con los datos obtenidos del formulario, me salta un error que no entiendo.

Cita:
Parse error: syntax error, unexpected end of file in /homepages/0/d513175986/htdocs/clickandbuilds/WordPress/MyBlog/ejemplo.php on line 392
Al ir a esa linea me encuentro con que es la última línea de código de la página

Cita:
392: </html>
¿ Qué significa ?
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #15 (permalink)  
Antiguo 31/07/2014, 07:51
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Mejor forma de validar formuario

Los errores de PHP son poco descriptivos, la linea que te indica no es ni de lejos la linea del error.

Un error tipo "unexpected end of file" implica que alguna estructura de control está sin cerrar apropiadamente, por eso el analizador de PHP te indica error en la última linea de código PHP posible donde debería existir el cierre de dicha estructura, etc.

Eso es todo, revisa bien tus estructuras lógicas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 31/07/2014, 08:05
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

El formulario antes de poner el código que procesa el formulario no da errores y funciona bien, pero al añadir el código sale eso, he revisado el código que he añadido pero no encuentro que falte algun cierre de }. Volveré a revisar.

EDITO: Encontré donde poner un corchete de cierre y al ponerlo ya no salta el error y ejecuta la página, pero en cambio no realiza la ejecución del formulario. Seguiré revisando.

Código PHP:
Ver original
  1. if(count($errores) == 0) {
  2.         echo "Se procesa el formulario.";
  3.     }

Muestra el echo correctamente. Pero si añado el código que procesa el formulario aparece lo que comenté antes.
Código PHP:
Ver original
  1. if($genero == "masculino") {
  2.     $esperanza_de_vida = rand(75,85);
  3. } else { $esperanza_de_vida = rand(80,90); }
  4. //calcular imc
  5. $altura_en_metros = $altura / 100;
  6. $imc = $altura_en_metros * $altura_en_metros;
  7. $imc_final = round($peso / $imc,1);
  8.  
  9. if($imc_final < 18) {
  10.     $estado_imc = 1;
  11. } elseif($imc_final >= 18 and $imc_final < 24.9) {
  12.     $estado_imc = 2;
  13. } elseif($imc_final >= 25 and $imc_final < 26.9) {
  14.     $estado_imc = 3;
  15. } elseif($imc_final >= 27 and $imc_final < 29.9) {
  16.     $estado_imc = 4;
  17. } elseif($imc_final >= 30 and $imc_final < 39.9) {
  18.     $estado_imc= 5;
  19. } elseif($imc_final > 40) {
  20.     $estado_imc = 6;
  21. }
  22.  
  23. $edad_restada_imc = 0;
  24. if($estado_imc == 1) {
  25.     $edad_restada_imc = $edad_restada_imc + 5;
  26. } elseif($estado_imc == 3) {
  27.     $edad_restada_imc = $edad_restada_imc + 5;
  28. } elseif($estado_imc == 4) {
  29.     $edad_restada_imc = $edad_restada_imc + 7;
  30. } elseif($estado_imc == 5) {
  31.     $edad_restada_imc = $edad_restada_imc + 10;
  32. } elseif($estado_imc == 6) {
  33.     $edad_restada_imc = $edad_restada_imc + 15;
  34.  
  35. if($_POST['fumar'] == "si") {
  36.     $cigarrillos_al_ano = $_POST['cigarrillos'] * 365;
  37.     $cigarrillos_totales_fumados = $cigarrillos_al_ano * $_POST['tiempofumando'];
  38.     $los_anos_que_quedan_por_fumar = ($esperanza_de_vida - $edad);
  39.     $cigarrillos_que_quedan_por_fumar = $los_anos_que_quedan_por_fumar * $cigarrillos_al_ano;
  40.     $suma_ambos = $cigarrillos_totales_fumados + $cigarrillos_que_quedan_por_fumar;
  41.     $pasar_a_minutos = $suma_ambos * 11;
  42.     $pasar_a_horas = $pasar_a_minutos / 60;
  43.     $pasar_a_dias = $pasar_a_horas / 24;
  44.     $pasar_a_anos = round($pasar_a_dias / 365);
  45. } else { $pasar_a_anos = 0; }
  46.  
  47. $edad_restada_alcohol = 0;
  48. if($_POST['beber'] == "apenas") {
  49.     $edad_restada_alcohol = $edad_restada_alcohol + 1;
  50. } elseif($_POST['beber'] == "fines") {
  51.     $edad_restada_alcohol = $edad_restada_alcohol + 2;
  52. } elseif($_POST['beber'] == "bastante") {
  53.     $edad_restada_alcohol = $edad_restada_alcohol + 4;
  54. } elseif($_POST['beber'] == "todoslosdias") {
  55.     $edad_restada_alcohol = $edad_restada_alcohol + 5;
  56. } elseif($_POST['beber'] == "alcoholico") {
  57.     $edad_restada_alcohol = $edad_restada_alcohol +15;
  58. }
  59.  
  60. if($_POST['drogas'] == "si") {
  61.     if($_POST['tipodrogas'] == "blandas" and $_POST['cadacuantodrogas'] == "apenas") {
  62.     $restado_por_drogas = 2; }
  63.     elseif($_POST['tipodrogas'] == "blandas" and $_POST['cadacuantodrogas'] == "amenudo") {
  64.     $restado_por_drogas = 4; }
  65.     elseif($_POST['tipodrogas'] == "blandas" and $_POST['cadacuantodrogas'] == "demasiado") {
  66.     $restado_por_drogas = 6; }
  67.     elseif($_POST['tipodrogas'] == "duras" and $_POST['cadacuantodrogas'] == "apenas") {
  68.     $restado_por_drogas = 6; }
  69.     elseif($_POST['tipodrogas'] == "duras" and $_POST['cadacuantodrogas'] == "amenudo") {
  70.     $restado_por_drogas = 8; }
  71.     elseif($_POST['tipodrogas'] == "duras" and $_POST['cadacuantodrogas'] == "demasiado") {
  72.     $restado_por_drogas = 10; }
  73.     elseif($_POST['tipodrogas'] == "ambas" and $_POST['cadacuantodrogas'] == "apenas") {
  74.     $restado_por_drogas = 8; }
  75.     elseif($_POST['tipodrogas'] == "ambas" and $_POST['cadacuantodrogas'] == "amenudo") {
  76.     $restado_por_drogas = 10; }
  77.     elseif($_POST['tipodrogas'] == "ambas" and $_POST['cadacuantodrogas'] == "demasiado") {
  78.     $restado_por_drogas = 15; }
  79.     } else { $restado_por_drogas = 0; }
  80.  
  81. if($_POST['alimentacion'] == "excelente") {
  82.     $alimentacion_alarga = 14;
  83. } elseif ($_POST['alimentacion'] == "decente") {
  84.     $alimentacion_alarga = 8;
  85. } elseif ($_POST['alimentacion'] == "decente") {
  86.     $alimentacion_alarga = 8;
  87. } elseif ($_POST['alimentacion'] == "normal") {
  88.     $alimentacion_alarga = 6;
  89. } elseif ($_POST['alimentacion'] == "decente") {
  90.     $alimentacion_alarga = 8;
  91. } elseif ($_POST['alimentacion'] == "bastantemala") {
  92.     $alimentacion_alarga = 0;
  93. } elseif ($_POST['alimentacion'] == "undesastre") {
  94.     $alimentacion_alarga = 0;
  95. }
  96.  
  97. if($_POST['ejercicio'] == "nunca") {
  98.     $ejercicio_alarga = 0;
  99. } elseif($_POST['ejercicio'] == "raravez") {
  100.     $ejercicio_alarga = 1;
  101. } elseif($_POST['ejercicio'] == "semanalmente") {
  102.     $ejercicio_alarga = 2;
  103. } elseif($_POST['ejercicio'] == "casitodoslosdias") {
  104.     $ejercicio_alarga = 4;
  105. }
  106. //suma total
  107. $cosasquerestan = $edad_restada_imc + $pasar_a_anos + $edad_restada_alcohol + $restado_por_drogas;
  108. $cosasquesuman = $alimentacion_alarga + $ejercicio_alarga;
  109. $resultadototal = ($esperanza_de_vida + $cosasquesuman) - $cosasquerestan;
  110. //imprimimos datos para comprobar
  111. echo "Esperanza de vida : <b>" . $esperanza_de_vida . "</b><br/>";
  112. echo "IMC : <b>" . $estado_imc . "</b> Edad restada por IMC: <b>" . $edad_restada_imc . "</b><br/>";
  113. echo "Fumar :<b> " . $fumar . "</b> Edad restada por FUMAR: <b>" . $pasar_a_anos . "</b><br/>";
  114. echo "Beber : <b>" . $beber . "</b> Edad restada por BEBER: <b>" .  $edad_restada_alcohol . "</b><br/>";
  115. echo "Drogas : <b>" . $drogas - "</b> Tipo : <b>" . $tipodrogas . "</b> Cada cuanto : <b>" . $cadacuantodrogas . "<b> Restado por drogas: <b>" . $restado_por_drogas . "</b><br/>";
  116. echo "Alimentación : <b>" . $alimentacion . "</b> Edad sumada por alimentación <b>" . $alimentacion_alarga . "</b><br/>";
  117. echo "Ejercicio <b>" . $ejercicio . "</b> Edad sumada por ejercicio <b>" . $ejercicio_alarga . "</b><br/>";
  118. echo "<br/><br/";
  119. echo "<b>" . $resultadototal . "</b>";

No he encontrado ahí errores de cierres de } pero al añadir el código en el condicional anterior, salta el error que comenté

Si no hay errores antes de poner el código que procesa el formulario, y no hay errores en el código que meto dentro, ¿ Donde está el error? ¿ Entra algo en conflicto ?
__________________
No te olvides de dar +1 a quien te echa un cable ;)

Última edición por rodrypaladin; 31/07/2014 a las 08:16
  #17 (permalink)  
Antiguo 31/07/2014, 19:24
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Generalmente ese error lo obtienes por que falta una llave de cierre, o sobra una de apertura, depende cómo lo veas.

Código PHP:
Ver original
  1. $edad_restada_imc = 0;
  2.     if($estado_imc == 1) {
  3.         $edad_restada_imc = $edad_restada_imc + 5;
  4.     } elseif($estado_imc == 3) {
  5.         $edad_restada_imc = $edad_restada_imc + 5;
  6.     } elseif($estado_imc == 4) {
  7.         $edad_restada_imc = $edad_restada_imc + 7;
  8.     } elseif($estado_imc == 5) {
  9.         $edad_restada_imc = $edad_restada_imc + 10;
  10.     } elseif($estado_imc == 6) {
  11.         $edad_restada_imc = $edad_restada_imc + 15;
  12.     // Aquí no aparece la llave de cierre
__________________
- León, Guanajuato
- GV-Foto
  #18 (permalink)  
Antiguo 01/08/2014, 05:57
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Gracias Triby, ahí estaba el error.

Por fin he validado el formulario casi completo, pero me encuentro con otro problema. ( si si, otro, increible pero cierto )

Imaginar que el formulario tiene 10 preguntas, y se te olvida poner 2, te salta el error diciendo que dos preguntas te faltan por responder, PERO, las otras 8 que si que has respuesto vuelven a su estado de "selecciona" es decir, tienen que volver a responder todas, en vez de solo responder las 2 que faltan.

¿¿ Alguna recomendación para ello ?? Gracias de nuevo chicos !!
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #19 (permalink)  
Antiguo 01/08/2014, 09:49
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Pero, se supone que estabas incluyendo los valores para cada input; habría que ver tu código completo para ver lo que falta.
__________________
- León, Guanajuato
- GV-Foto
  #20 (permalink)  
Antiguo 01/08/2014, 12:35
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Aquí dejo el código del formulario si es el que necesitas:

Código PHP:
Ver original
  1. <form method="post" action="ejemplo.php" enctype="x-www-form-urlencoded">
  2.             <h3><terror>Sobre tu físico</terror></h3><br/>
  3.             <table border="0" align="left">
  4.                 <tr>
  5.                 <td><?php if(isset($errores['edad'])) { echo "<errores> Edad </errores>"; } else { echo "<enun> Edad </enun>"; } ?></td>
  6.                 <td>
  7. <?php
  8. // Crear select con opción predefinida
  9. html_select('edad', '20', 'edad', $edad, array(), 14, 100);
  10. ?>
  11.                 </td>
  12.                 <td>
  13.                 <enunleft>años</enunleft>
  14.                 </td>
  15.                 </tr>
  16.                 <tr>
  17.                     <td><?php if(isset($errores['peso'])) { echo "<errores> Peso </errores>"; } else { echo "<enun> Peso </enun>"; } ?></td>
  18.                     <td>
  19. <?php
  20. // Crear select con opción predefinida
  21. html_select('peso', '70', 'peso', $peso, array(), 30, 200);
  22.  
  23. ?>
  24.                     </td>
  25.                      <td>
  26.                 <enunleft>Kg</enunleft>
  27.                 </td>
  28.                 </tr>
  29.                 <tr>
  30.                     <td><?php if(isset($errores['altura'])) { echo "<errores> Altura </errores>"; } else { echo "<enun> Altura </enun>"; } ?></td>
  31.                     <td>
  32. <?php
  33. // Crear select con opción predefinida
  34. html_select('altura', '70', 'altura', $altura, array(), 130, 250);
  35.  
  36. ?>
  37.  
  38.  
  39.                     </td>
  40.                      <td>
  41.                 <enunleft>Cm</enunleft>
  42.                 </td>
  43.                 </tr>
  44.                 <tr>
  45.                     <td><?php if(isset($errores['genero'])) { echo "<errores> Genero </errores>"; } else { echo "<enun> Genero </enun>"; } ?></td>
  46.                     <td>
  47.  
  48. <input type=radio name="genero" value="masculino">Masculino
  49. <input type=radio name="genero" value="femenino">Femenino
  50.  
  51.                     </td>
  52.                 </tr>
  53.             </table>
  54.             <div class="separador">
  55.         </div>
  56.         <h3><terror>Sobre tus hábitos</terror></h3><br/>
  57.         <table border="0" align="left">
  58.             <tr>
  59.                 <td class="celda"><?php if(isset($errores['fumar'])) { echo "<errores> ¿Fumas tabaco? </errores>"; } else { echo "<enun> ¿Fumas tabaco? </enun>"; } ?></td>
  60.                 <td><INPUT type=radio name="fumar" value="si">Si
  61.                     <INPUT type=radio name="fumar" value="no">No</td>
  62.                 <td><preg><enun>¿Cúantos cigarrillos al día?</enun></preg></td>
  63.                 <td>
  64.                <SELECT name="cigarrillos">
  65.                 <?php
  66.                     for($i=1;$i<=60;$i++) {
  67.                         echo "<OPTION VALUE=\"$i\">$i</OPTION>";
  68.                     }
  69.                     ?>
  70.                 </SELECT>
  71.                 </td>
  72.                     <td><enun>¿Cúanto años llevas fumando?</enun></td>
  73.                <SELECT name="tiempofumando">
  74.                 <?php
  75.                     for($i=1;$i<=50;$i++) {
  76.                         echo "<OPTION VALUE=\"$i\">$i</OPTION>";
  77.                     }
  78.                     ?></SELECT>
  79.                 </td>
  80.             </tr>
  81.         </table>
  82.         <table border="0" align="left">
  83.         <tr>
  84.             <td><?php if(isset($errores['beber'])) { echo "<errores> ¿Bebes alcohol? </errores>"; } else { echo "<enun> ¿Bebes alcohol? </enun>"; } ?></td>
  85.             <td><INPUT type=radio name="beber" value="nunca">Nunca</td>
  86.             <td><INPUT type=radio name="beber" value="apenas">Apenas</td>
  87.             <td><INPUT type=radio name="beber" value="fines">Los fines de semana</td>
  88.             <td><INPUT type=radio name="beber" value="bastante">Bastante</td>
  89.             <td><INPUT type=radio name="beber" value="todoslosdias">Todos los días</td>
  90.             <td><INPUT type=radio name="beber" value="alcoholico">Muchisimo</td>
  91.         </tr>
  92.         </table>
  93.         <table border="0" align="left">
  94.         <tr>
  95.             <td><?php if(isset($errores['drogas'])) { echo "<errores> ¿Tomas drogas? </errores>"; } else { echo "<enun> ¿Tomas drogas? </enun>"; } ?></td>
  96.             <td><INPUT type=radio name="drogas" value="si">Si
  97.                 <INPUT type=radio name="drogas" value="no">No</td>
  98.             <td><preg><enun>¿De qué tipo?</enun></preg></td>
  99.             <td><SELECT name="tipodrogas">
  100.                     <OPTION VALUE="Ninguna">Ninguna</OPTION>
  101.                     <OPTION VALUE="blandas">Blandas</OPTION>
  102.                     <OPTION VALUE="duras">Duras</OPTION>
  103.                     <OPTION VALUE="ambas">Ambas</OPTION>
  104.                     </SELECT></td>
  105.             <td><enun>¿Cada cúanto?</enun></td>
  106.             <td><SELECT name="cadacuantodrogas">
  107.                     <OPTION VALUE="Ninguna">Ninguna</OPTION>
  108.                     <OPTION VALUE="apenas">Apenas</OPTION>
  109.                     <OPTION VALUE="amenudo">A menudo</OPTION>
  110.                     <OPTION VALUE="demasiado">Demasiado</OPTION>
  111.                     </SELECT></td>
  112.         </tr>
  113.         </table>
  114.         <table border="0" align="left">
  115.         <tr>
  116.             <td><?php if(isset($errores['alimentacion'])) { echo "<errores> ¿Como es tu alimentación? </errores>"; } else { echo "<enun> ¿Como es tu alimentación? </enun>"; } ?></td>
  117.             <td><INPUT type=radio name="alimentacion" value="nunca">Excelente</td>
  118.             <td><INPUT type=radio name="alimentacion" value="apenas">Decente</td>
  119.             <td><INPUT type=radio name="alimentacion" value="fines">Normal</td>
  120.             <td><INPUT type=radio name="alimentacion" value="bastante">Bastante mala</td>
  121.             <td><INPUT type=radio name="alimentacion" value="todoslosdias">Un desastre</td>
  122.         </tr>
  123.         </table>
  124.         <table border="0" align="left">
  125.         <tr>
  126.             <td><?php if(isset($errores['ejercicio'])) { echo "<errores> ¿Haces ejercicio? </errores>"; } else { echo "<enun> ¿Haces ejercicio? </enun>"; } ?></td>
  127.             <td><INPUT type=radio name="ejercicio" value="nunca">Nunca</td>
  128.             <td><INPUT type=radio name="ejercicio" value="raravez">Rara vez</td>
  129.             <td><INPUT type=radio name="ejercicio" value="semanalmente">Semanalmente</td>
  130.             <td><INPUT type=radio name="ejercicio" value="casitodoslosdias">Casi todos los días</td>
  131.         </tr>
  132.         </table>
  133.         <br/><br/>
  134.         <div class="separador">
  135.         </div>
  136.         <h3><terror>Sobre tus gustos</terror></h3><br/>
  137.         <table border="0" align="left" style="width: 900px;">
  138.         <tr style="width: 300px;">
  139.             <TD><input type="checkbox" name="tomarelsol" value="tomarelsol">Opcion 1</TD>
  140.             <TD><input type="checkbox" name="conduccionrapida" value="conduccionrapida">Opción 2</TD>
  141.             <TD><input type="checkbox" name="deportesextremos" value="deportesextremos">Opción 3</TD>
  142.             <TD><input type="checkbox" name="cometerdelitos" value="cometerdelitos">Opción 4</TD>
  143.         </tr style="width: 300px;">
  144.         <tr>
  145.             <TD><input type="checkbox" name="viajarmucho" value="viajarmucho">Opción 5</TD>
  146.             <TD><input type="checkbox" name="nousarpreservativos" value="nousarpreservativos">Opción 6</TD>
  147.             <TD><input type="checkbox" name="sexuales" value="sexuales">Opción 7</TD>
  148.             <TD><input type="checkbox" name="salirtodoslosfines" value="salirtodoslosfines">Opción 8</TD>
  149.         </tr style="width: 300px;">
  150.         <tr>
  151.             <TD><input type="checkbox" name="frecuentardiscotevas" value="frecuentardiscotecas">Opción 9</TD>
  152.             <TD><input type="checkbox" name="trasnocharmucho" value="trasnocharmucho">Opción 10</TD>
  153.             <TD><input type="checkbox" name="trabajarmucho" value="trabajarmucho">Opción 11</TD>
  154.             <TD><input type="checkbox" name="tomarmuchocafe" value="tomarmuchocafe">Opción 12</TD>
  155.         </tr>
  156.         </table>
  157.         <input type="submit" class="button" value="enviar"/><br/>
  158.         </form>
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #21 (permalink)  
Antiguo 01/08/2014, 13:08
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Bueno, solo los selectes tienen función y variables para conservar los valores; falta hacerlo también con los radios y checkbox.
__________________
- León, Guanajuato
- GV-Foto
  #22 (permalink)  
Antiguo 01/08/2014, 14:36
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Pero tampoco en los select conserva el valor para cuando saltan los errores recordando que faltan preguntas por responder.

EDITO: Supuestamente esto es lo que haría que se quedara guardado el valor para no tener que volver a seleccionarlo en los select, pero no lo realiza.

Código PHP:
Ver original
  1. foreach($options as $key => $val) {
  2.         // Para establecer la opción preseleccionada
  3.         $selected = ($key == $value) ? ' selected="selected"' : '';
  4.         echo "\t<option value=\"$key\"$sel>$val</option>\n";
  5.     }
__________________
No te olvides de dar +1 a quien te echa un cable ;)

Última edición por rodrypaladin; 01/08/2014 a las 17:05
  #23 (permalink)  
Antiguo 01/08/2014, 19:46
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Mejor forma de validar formuario

Y cómo quedo la función?, porque me parece que agregaste un parámetro o hiciste otra modificación.

Originalmente era esto:
Código PHP:
Ver original
  1. <?php
  2. // Una función útil para crear selects
  3. function html_select($name, $id, $value, $options = array(), $start = 0, $end = 0) {
  4.     echo "<select name=\"$name\" id=\"$id\">\n";
  5.     if(count($options) == 0) {
  6.         // Creamos el array con inicio y fin
  7.         if($start > 0) {
  8.             // Agregamos opción cero
  9.             $options[0] = 'Selecciona...';
  10.         }
  11.         for($i = $start; $i <= $end; $i++) {
  12.             $options[$i] = $i;
  13.         }
  14.     }
  15.     // Agregamos las opciones
  16.     foreach($options as $key => $val) {
  17.         // Para establecer la opción preseleccionada
  18.         $selected = ($key == $value) ? ' selected="selected"' : '';
  19.         echo "\t<option value=\"$key\"$sel>$val</option>\n";
  20.     }
  21.     echo "</select>\n";
  22. }

Y la ejecutas así:

Código PHP:
Ver original
  1. html_select('peso', '70', 'peso', $peso, array(), 30, 200);
  2. /*
  3.     'peso' <<< OK, corresponde a $name
  4.     '70'     <<< Este no sé de dónde salió **********
  5.     'peso' <<< OK $id
  6.     $peso <<< OK $value
  7.     30       <<< OK $start
  8.     200     <<< OK $end
  9. */
__________________
- León, Guanajuato
- GV-Foto
  #24 (permalink)  
Antiguo 01/08/2014, 21:09
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Mejor forma de validar formuario

Si, perdona, le metí un size, para cambiar el ancho del select, pero lo quité hace nada porque al final no lo necesitaba. pero no era por eso, el valor desaparece igualmente.
__________________
No te olvides de dar +1 a quien te echa un cable ;)

Etiquetas: forma, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:58.