Ver Mensaje Individual
  #30 (permalink)  
Antiguo 06/08/2011, 10:33
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

Este tema me está rayando sobremanera, así que es lo último que voy a comentar. Cambias las condiciones a cada post que escribes y nos estás volviendo loco. Yo te propongo, por qué no validas por separado los campos?

Cita:
// 1) Si un checkbox o varios están marcados y completos se envian (también pueden ser los 4)
// 2) Pero si uno o varios checkbox están marcados e incorrectos no se envian
// 3) Si ninguno está marcado no se envia
Aquí veo que los check y campos son independientes entre si, salvo por 3). Es decir, se envían los buenos y los malos no se envían siempre que al menos haya uno bueno. Si todos son malos, falla la validación. Tratando cada check por separado tienes cuatro casos:
CASO 1: el check marcado y bien relleno: se envía el valor.
CASO 2: el check marcado, pero mal relleno (o sin rellenar): no se envía el valor, pero el formulario sí puede enviarse en caso de que haya otro check correcto.
CASO 3: el check no marcado, pero relleno: se pierde el valor, por no marcar el check.
CASO 4: el check no marcado y mal relleno (o sin rellenar): es correcto, el formulario seguirá enviándose con este campo vacío siempre que haya otro check correcto.

Pues esto se pasa a código:
Código PHP:
Ver original
  1. // Repetir este trozo por cada check que exista...
  2. $message1 = "";
  3. $check1 = false;
  4. if (isset($_post['check1'])) {
  5.     if (($_POST['text1]) != "") && ($_POST['text1'] != "Incompleto")) {
  6.        echo "CASO 1: check1 marcado y relleno";
  7.        $message1 = "El formulario está bien validado (se marcó el check1 y se rellenó el campo correspondiente), el valor se enviará correctamente.";
  8.        check1 = true;    // Ponemos a true el campo para saber que se envía este check, en cualquier otro caso (check1 == false) se enviará vacío.
  9.    } else {
  10.        echo "CASO 2: check1 marcado, pero sin rellenar";
  11.        $message1 = "Lo siento, has marcado el check1, pero el campo no está relleno o contiene Incompleto.";
  12.    }
  13. } else {
  14.    if (($_POST['text1']) != "") && ($_POST['text1'] != "Incompleto")) {
  15.        echo "CASO 3: check1 no marcado, pero relleno";
  16.        &message1 = "Cuidado, amigo!!! Ha rellenado el campo de texto con un valor correcto, pero se ha olvidado marcar el check1, el valor no se enviará.";
  17.    } else {
  18.        echo "CASO 4: check1 no marcado y sin rellenar";
  19.        $message1 = "El formulario está bien validado (el check1 no se marcó y no hay valor en el campo de texto). El registro se guardará con el campo vacío";
  20.    }
  21. }
  22. // ...hasta aquí.
  23.  
  24. // A la hora de enviarlo
  25. if (check1 || check || check3 || ... ) // Al menos tiene que haber uno correcto para que se envíe el formulario, con los incorrectos o sin rellenar a vacío.
  26.    $sql = "INSERT INTO Tabla (text) VALUES ('";
  27.    if (check) {
  28.        $sql .= $_POST['text'];
  29.    } else {
  30.        $sql .= "";    // Si no validó con relleno, se envía vacío el campo
  31.    }
  32.    $sql .= "')";
  33. } else {
  34.    echo "ERRORRRRRR!!!!! El formulario no se envía, no hay ninguno correcto".
  35. }

Y ya. La versión que ofrecía New, era similar, salvo que mete en un bucle for, usando en vez de check1, check2, check3... un array de checks, de forma que comprueba check[1], check[2], check[3]... y se puede meter todo en un bucle para check[$i]. También puedes hacerlo aquí, en vez de copiar y pegar el código para cada check, puede hacer un bucle, pero eso ya te lo dejo a ti. Yo lo siento mucho, pero me retiro de este post, ya le he dedicado suficiente y creo que con lo que tienes aquí tienes de sobra para montar cualquier if que se te ocurra. Si no eres capaz, pues es que no lo planteas bien, pero ya no se puede enseñar más. Por mucho que quiera, no puedo obligarte a entenderlo, o lo entiendes o no.

Un saludo.
__________________
¿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?