Ver Mensaje Individual
  #25 (permalink)  
Antiguo 05/08/2011, 02:10
Avatar de vgonga1986
vgonga1986
 
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Evitar envio de formulario con checkbox marcado con otro campo input vacio

Te estás complicando de mala manera y, además, me da que hace ya tiempo que ni si quiera piensas las cosas que haces, simplemente pruebas a ciegas en vez de pararte y analizar el problema. Nosotros podemos darte una idea y yo estoy seguro que me pongo y en un par de minutos te doy la solución, pero no te vale de nada, tienes que llegar tú a la solución y eso sólo lo vas a conseguir si prestas atención y, más importante, piensas.

Te doy la guía, lo que tienes que hacer es, una vez montado el if, ver los flujos que habrá para las diferentes ejecuciones. Copio de tu código y te guío:
Código PHP:
Ver original
  1. if (isset($_POST['check11'])) {
  2.         // check11=true
  3.         if (isset($_POST['check12'])) {
  4.             // check11=true, check12=true
  5.             if (isset($_POST['check20'])) {
  6.                 // check11=true, check12=true, check20=true
  7.                 if ($cond1 && $cond2 && $cond3) {
  8.                    // check11=true, check12=true, check20=true, (cond1 && cond2 && cond3)=true. Del último sacamos que cond1=true, cond2=true, cond3=true
  9.                 } else {
  10.                    // check11=true, check12=true, check20=true, (cond1 && cond2 && cond3)=false. Del último sacamos que uno o varios cond (cond1, cond2, cond3) son falsos, al menos uno, pero pueden ser todos.
  11.                 }
  12.             }
  13.         }
  14.     // a partir de aquí, si entra en algún elseif quiere decir que el primer if no se ha cumplido (no ha llegado a un final, luego a partir de aquí (check11 && check12 && check20)=false. Pero esta condición puede ser falsa para cualquier falso de check, como mínimo uno.
  15.     } elseif (isset($_POST['check11'])) {
  16.         // check11=true
  17.         if ($cond1) {
  18.            // check11=true, cond1=true
  19.         } else {
  20.            // check11=true, cond1=false
  21.         }
  22.     // a partir de aquí, check11=false
  23.     } elseif (isset($_POST['check12'])) {
  24.         // check12=true
  25.         if ($cond2) {
  26.            // check12=true, cond2=true
  27.         } else {
  28.            // check12=true, cond2=false
  29.         }
  30.     // a partir de aquí, check12=false
  31.     } elseif (isset($_POST['check20'])) {
  32.         // check20=true
  33.         if ($cond3) {
  34.            // check20=true, cond3=true
  35.         } else {
  36.            // check20=true, cond3=false
  37.         }
  38.     // a partir de aquí, check20= false
  39.     } else {
  40.         // (check11 && check12 && check20)=false, check11=false, check12=false, check20= false
  41.     }

Y ahora te pones casos posibles:
Caso 1: check11=true, check12=true, check20=false, cond1=true, cond2=false, cond3=true
Código PHP:
Ver original
  1. if (isset($_POST['check11'])) { // entra
  2.         if (isset($_POST['check12'])) { // entra
  3.             if (isset($_POST['check20'])) { // no entra, al no entrar se va al final del if
  4.                 if ($cond1 && $cond2 && $cond3) {
  5.  
  6.                 } else {
  7.  
  8.                 }
  9.             } // aquí viene del no entra y sigue
  10.         } // sigue
  11.     } elseif (isset($_POST['check11'])) { // entra
  12.         if ($cond1) { // entra
  13.            // Hace lo que haya aquí
  14.         } else {
  15.  
  16.         }
  17.     } elseif (isset($_POST['check12'])) { // entra
  18.         if ($cond2) { // no entra y se va a else
  19.  
  20.         } else {
  21.            // Hace lo que haya aquí
  22.  
  23.         }
  24.     } elseif (isset($_POST['check20'])) { // no entra y sigue
  25.         if ($cond3) {
  26.  
  27.         } else {
  28.  
  29.         }
  30.     } else { // no entra, porque entró en al menos uno de los otros
  31.  
  32.     }

Eso es un ejemplo de flujo, pero puedes hacer mil. Ya con este te das cuenta de que tu if es desastroso, porque las condiciones de un if tienen que ser excluyentes, es decir, no puede entrar por dos, porque se te descontrola. Y el tuyo está muy descontrolado. Estoy seguro que incluso hay un caso en que entra por todos los ifs (menos el else, obviamente) cosa que es nefasta. Las condiciones de un if deben ser completas y excluyentes. Te pongo un ejemplo:
Código PHP:
Ver original
  1. if ($num < 4) {
  2.  
  3. } else if ($num >= 4 && $num < 20) {
  4.  
  5. } else { // se sobreentiende que $num >= 20
  6.  
  7. }
Este caso es completo y excluyente, porque para cualquier valor de $num entra por un if y, además, sólo por uno.
Código PHP:
Ver original
  1. if ($num < 1) {
  2.  
  3. } else if ($num >= 4 && $num < 20) {
  4.  
  5. } else { // se sobreentiende que $num >= 20
  6.  
  7. }
Este caso no es completo, pero si excluyente, es decir, nunca se entra por dos, pero qué pasa cuando $num está entre 1 y 4? No entra por ninguno, no es completo.
Código PHP:
Ver original
  1. if ($num < 8) {
  2.  
  3. } else if ($num >= 4 && $num < 20) {
  4.  
  5. } else { // se sobreentiende que $num >= 20
  6.  
  7. }
Este caso es completo, pero no excluyente, es decir, siempre entra por alguno, pero qué pasas cuando $num está entre 4 y 8? Que cumple dos condiciones, debería entrar por dos ifs.
Código PHP:
Ver original
  1. if ($num == 5) {
  2.  
  3. } else if ($num >= 4 && $num < 20) {
  4.  
  5. } else if ($num >= 20)
  6.  
  7. } // sin else
Este caso ni es completo ni excluyente. Porque para cualquier valor menor de 4 no entra por ningún if y, además, si $num es 5, cumple las condiciones de los dos primeros.

En serio, replantéate el problema tranquilamente, diferencia las condiciones unas de otras claramente y monta un buen if, te juro es lo más sencillo del mundo. Espero que la explicación te sirva de algo.

Un saludo.

PD: Por el amor de dios, deja de citar textos enteros, porque cada vez que cargo este post mi ordenador echa humo. Simplemente contesta, no hace falta que cites nuestros posts.
__________________
¿Alguna pregunta, duda, acotación, nota, cuestión, reparo, comentario, demanda, crítica, interpretación, objeción, interrogante, discrepancia, observación, réplica, disquisición, apostilla o exégesis?

Última edición por vgonga1986; 05/08/2011 a las 02:12 Razón: Añadir PD.