Foros del Web » Programando para Internet » PHP »

Peoblema con if anidado (no se cumplen condiciones)

Estas en el tema de Peoblema con if anidado (no se cumplen condiciones) en el foro de PHP en Foros del Web. Saludos a todos los usarios, colaboradores y administradores de este gran foro. Espero me puedan echar una mano con el siguiente problema. Cuento con un ...
  #1 (permalink)  
Antiguo 12/01/2016, 17:26
 
Fecha de Ingreso: julio-2009
Mensajes: 63
Antigüedad: 10 años, 4 meses
Puntos: 0
Peoblema con if anidado (no se cumplen condiciones)

Saludos a todos los usarios, colaboradores y administradores de este gran foro.

Espero me puedan echar una mano con el siguiente problema.

Cuento con un formulario para una tienda mismo que tiene diferentes campos segun la categoria, dependiendo la categoria, jquery me arma un formulario con determinados campos u otro.

Ahora bien, como la validación con javascript es menos segura que la validacion del lado del servidor, he decidido realizarla unicamente del lado del servidor, intentando que esta sea lo menos perceptible para el usuario (es decir, todo sobre la misma pagina, dando la apariencia que no se sale de la misma).

He desarrollado un codigo php que si bien no esta terminado, pues por ahora solo comprueba que los campos no se encontraran vacios, no funciona del todo bien. Resulta que en primera instancia, si las condiciones no se cumplen muestra el mensaje "los datos no pasan", este mensaje solo lo he puesto de modo que pueda verificar el flujo de datos. En caso de que las condiones si se cumplan se muestra el mensaje "rutina para insertar en db", en este punto es donde crearia el codigo necesario para introducir los datos en mi tabla mysql.

El codigo que utilizo es el siguiente:


Código PHP:
<?

$categoria
=$_POST["categoria"]; //definimos la caregoria.
    //Si la categoria no se ha seleccionado entonces imprimimos el formulario.
    
if(isset($_POST["Publicar"]) && ($categoria=="cat")or($categoria=="")){
        echo 
"$principal";break;
    }
    else{
        
//comprobamos categoria Accesorios y refacciones
        
if(($categoria=="Accesorios y refacciones")){
        }
        
//Comprobamos que los campos no se encuentren vacios
        
if(($_POST["ar1"]!="")&&($_POST["ar2"]!="")&&($_POST["ar3"]!="0")&&($_POST["ar4"]!="")&&($_POST["ar5"]!="")&&($_POST["ar6"]!="")&&($_POST["ar7"]!="")&&($_POST["ar8"]!="0")&&($_POST["ar9"]!="0")&&($_POST["ar10"]!="")&&($_POST["ar11"]!="")&&($_POST["ar12"]!="")){
        echo
"rutina para insertar en db";
        } 
    else{
        
//comprobamos categoria Computadoras y accesorios    
        
if(($categoria=="Computadoras y accesorios")){
        }
        
//Comprobamos que los campos no se encuentren vacios
        
if(($_POST["ca1"]!="")&&($_POST["ca2"]!="")&&($_POST["ca3"]!="0")&&($_POST["ca4"]!="0")&&($_POST["ca5"]!="")&&($_POST["ca6"]!="")&&($_POST["ca7"]!="")&&($_POST["ca8"]!="0")&&($_POST["ca9"]!="0")&&($_POST["ca10"]!="")&&($_POST["ca11"]!="")&&($_POST["ca12"]!="")){
        echo
"rutina para insertar en db";
        }
    else{
        
//comprobamos categoria Celulares y teléfonos
        
if(($categoria=="Celulares y teléfonos")){
        }
        if((
$_POST["ct1"]!="")&&($_POST["ct2"]!="")&&($_POST["ct3"]!="0")&&($_POST["ct4"]!="")&&($_POST["ct5"]!="")&&($_POST["ct6"]!="0")&&($_POST["ct7"]!="0")&&($_POST["ct8"]!="")&&($_POST["ct9"]!="0")&&($_POST["ct10"]!="")&&($_POST["ct11"]!="")&&($_POST["ct12"]!="")&&($_POST["ct13"]!="0")&&($_POST["ct14"]!="0")&&($_POST["ct15"]!="")&&($_POST["ct16"]!="")&&($_POST["ct17"]!="")){
        echo
"rutina para insertar en db";
        }
    else{
        
//comprobamos categoria Consolas y videojuegos
        
if(($categoria=="Consolas y videojuegos")){    
        }
        if((
$_POST["cv1"]!="")&&($_POST["cv2"]!="")&&($_POST["cv3"]!="0")&&($_POST["cv4"]!="")&&($_POST["cv5"]!="0")&&($_POST["cv6"]!="")&&($_POST["cv7"]!="")&&($_POST["cv8"]!="")&&($_POST["cv9"]!="")&&($_POST["cv10"]!="")&&($_POST["cv11"]!="0")&&($_POST["cv12"]!="0")&&($_POST["cv13"]!="")&&($_POST["cv14"]!="")&&($_POST["cv15"]!="")){
        echo
"rutina para insertar en db";
        }
    else{
        
//comprobamos categoria Tv, video, audio y fotografía
        
if(($categoria=="Tv, video, audio y fotografía")){
        }
        if((
$_POST["tvaf1"]!="")&&($_POST["tvaf2"]!="")&&($_POST["tvaf3"]!="0")&&($_POST["tvaf4"]!="")&&($_POST["tvaf5"]!="0")&&($_POST["tvaf6"]!="0")&&($_POST["tvaf7"]!="")&&($_POST["tvaf8"]!="0")&&($_POST["tvaf9"]!="")&&($_POST["tvaf10"]!="")&&($_POST["tvaf11"]!="")&&($_POST["tvaf12"]!="0")&&($_POST["tvaf13"]!="0")&&($_POST["tvaf14"]!="")&&($_POST["tvaf15"]!="")&&($_POST["tvaf16"]!="")){
        echo
"rutina para insertar en db";
        }
    else{    
        
//comprobamos categoria Muebles
        
if(($categoria=="Muebles")){
        }
        if((
$_POST["m1"]!="")&&($_POST["m2"]!="")&&($_POST["m3"]!="")&&($_POST["m4"]!="")&&($_POST["m5"]!="0")&&($_POST["m6"]!="0")&&($_POST["m7"]!="")&&($_POST["m8"]!="")&&($_POST["m9"]!="")&&($_POST["m10"]!="0")&&($_POST["m11"]!="0")&&($_POST["m12"]!="")&&($_POST["m13"]!="")&&($_POST["m14"]!="")){
        echo
"rutina para insertar en db";
        }
    else{
        
//comprobamos categoria ropa y calzado
        
if(($ctegoria=="Ropa y calzado")){
        }
        if((
$_POST["rc1"]!="")&&($_POST["rc2"]!="")&&($_POST["rc3"]!="")&&($_POST["rc4"]!="")&&($_POST["rc5"]!="")&&($_POST["rc6"]!="0")&&($_POST["rc7"]!="0")&&($_POST["rc8"]!="")&&($_POST["rc9"]!="")&&($_POST["rc10"]!="")){
        echo
"rutina para insertar en db";
        }
    else{
        echo
"los datos no pasan";
            }
                }
                    }
                        }
                            }
                                }
                                    }
                                        }
                                        
                                        echo 
$categoria;
<?
En principio si me funcionan las condiciones, lo extraño es que una vez que me muestra el mensaje "rutina para insertar en db" si le doy atras en el navegador y cambio la categoria y le doy enviar (aun dejando campos vacios), me sigue mostrando el mensaje "rutina para insertar en db" cuando en realidad me deberia de mostrar el mensaje "los datos no pasan" pues se cambian los campos de formulario y varios aparecen vacios.

He probado haciendo echo de la categoria para comprobar si funciona correctamente y si, en efecto funciona, cambia si se cambia en el formulario, pero al cambiarla ya no realiza la validacion y eso seria un inconveniente pues haciendo eso, cualquiera podria darle atras en navegador y una vez realizada la validacion, rellenar los campos con los datos que se quiera y volver a enviar pues ya no realizaria la validacion en el segundo envio (es decir, si pasa la validacion en el primer submit y se da atras en el navegador y se cambia los datos o se borran, se puede hacer un segundo submit y sigue pasando la validacion, lo cual no seria correcto).

Espero cualquier comentario, observacion o sugerencia y de antemano agradezco la atencion prestada.

Saludos!!!
  #2 (permalink)  
Antiguo 12/01/2016, 17:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 11 años, 8 meses
Puntos: 2534
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

En mi opinión, tu código tiene un formato tan malo que cuesta leerlo y hasta entenderlo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/01/2016, 17:35
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 4 años
Puntos: 39
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

Prueba cambiar !="" por isset.

Pd. Por lo general en programación, las llaves van de adentro hacia afuera, por estructura. Y vamos, me enredé con muchísimos if y else
  #4 (permalink)  
Antiguo 12/01/2016, 17:43
 
Fecha de Ingreso: julio-2009
Mensajes: 63
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

Cita:
Iniciado por pateketrueke Ver Mensaje
En mi opinión, tu código tiene un formato tan malo que cuesta leerlo y hasta entenderlo.
Ok gracias por la observación, en realidad no soy muy bueno en php, aveces hago cosas para ir aprendiendo y no pido que me den un codigo, ni que me lo desarrollen, quizas si me señalan la direccion correcta lo pueda realizar yo solo.

lo que ncesito hacer es algo como lo sigiuente.

si categoria=="categoria1"
y ademas todos los campos se encuentran llenos,
entonces ingreso en base de datos.

de lo contrario reviso si es =="categoria2"
y ademas todos los campos se encuentran llenos,
entonces ingreso en base de datos.

y asi sucesivamente.

si no se cumple ninguna, entonces muestro el else con mi mensaje.

No soy programador experto ni mucho menos, acepto todos los comentarios, criticas constructivas y consejos.

De antemano te agradezco tu comentario, la critica me ayuda a ver mis errores.
  #5 (permalink)  
Antiguo 13/01/2016, 05:55
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 9 años, 1 mes
Puntos: 123
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

Yo normalmente para validar los datos suelo hacer lo siguiente

Código PHP:
Ver original
  1. //creo una bandera
  2. $flag=0;
  3. //compruebo los datos uno por uno
  4. //Ejemplo:
  5. //if (VALIDACION...){$flag=1; echo 'MENSAJE ERROR...';}
  6.  
  7. if (!isset (  $variable )){$flag=1; echo 'variable no existe';}
  8. if (!isset (  $variable2 )){$flag=1; echo 'variable2 no existe';}
  9. / / tantos if como necesites
  10.  
  11. // verificó que todo este correcto
  12. if (  $flag===0 ){ echo ' Datos ok'; }else { echo ' Algo a fallado. Revise los campos.'; exit; }
  #6 (permalink)  
Antiguo 13/01/2016, 08:46
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 550
Antigüedad: 14 años
Puntos: 23
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

Unas reglas de oro:
  • Nombres descriptivos en variables y argumentos, porque ar1, ar2 no dicen nada
  • Evitar sobrecarga de responsabilidades en los métodos o funciones
  • Evitar if anidados porque esto denota una sobrecarga de responsabilidades
hay muchas más pero estas son las que si o si debes cumplir para tener un código entendible.
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida
  #7 (permalink)  
Antiguo 14/01/2016, 18:07
 
Fecha de Ingreso: julio-2009
Mensajes: 63
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

Cita:
Iniciado por vb2005 Ver Mensaje
Unas reglas de oro:
  • Nombres descriptivos en variables y argumentos, porque ar1, ar2 no dicen nada
  • Evitar sobrecarga de responsabilidades en los métodos o funciones
  • Evitar if anidados porque esto denota una sobrecarga de responsabilidades
hay muchas más pero estas son las que si o si debes cumplir para tener un código entendible.
Ok lo de ar1 ar2 (significa accesorios y refacciones y el numero de campo).

Ahora bien, para no sobrecargar las condiciones, ¿Cuál sería el método ideal para hacer lo que necesito?

Primero evaluar si la variable $categoria es == categoria1 o igual a categoria 2 o igual a categoria 3 (categorias que estan en una misma rama digamos)
si la condicion es correcta, evaluar si todos los campos estan llenos, si todo es correcto ejecutar la rutina para insertar en bd .

Luego si la primera condicion no se cumplio verificar si la variable $categoria es == a categoria4 o categoria5 o categoria6, si se cumple la condicion seguirnos a la sigiuente condicion y verificamos que todos los campos esten llenos, si es true entonces insertar en bd, si es false entonces, entonces seguirnos con el siguiente grupo de categorias.

si $categoria==categoria7 o categoria8 o categoria8, seguimos con la validacion de sus respectivos campos, si todo ok, entonces insertamos en bd, si no se cumplen seguimos validando y al final si nada se cumple mostramos el error generico.

Y asi sucesivamente con tantos grupos de categorias sea necesario, es decir, validar que la categoria sea igual a las que tengo definidas, y despues validar sus campos llenos, si todo ok, entonces insertamos, de lo contrario mostramos error. Pero la idea es que como cada categoria tiene campos disntintos por eso mi idea de validar por categoria y por campos.

Algo asi: (las categorias siempre se cumplen porque vienen por un select, aun asi las comprobamos para evitar problemas)

(primer grupo de condiciones)
condicion categoria - (si se cumple seguimos) (si no se cumple mostramos error)
condicion campos llenos - (si se cumple seguimos) (si no se cumple mostramos error)
resultado - (En este punto se cumplieron las dos primeras entonces insertamos en base de datos)
-------------------------------------------------------------------------------------------------------
(segundo grupo de condiciones)--si en el primer grupo la condicion categoria no se cumplio
comparamos categoria con el segundo grupo de categorias -(si se cumple seguimos) (si no se cumple mostramos error)
condicion campos llenos - (si se cumple seguimos) (si no se cumple mostramos error)
resultado - (En este punto se cumplieron las dos primeras del segundo grupo entonces insertamos en base de datos)

... Y asi sucesivamente.

Algun consejo o sugerencia para lograrlo.

Cita:
Iniciado por rodocoyote15 Ver Mensaje
Prueba cambiar !="" por isset.
Seguí tu consejo y me funciona bien, aunque los campos select como la primera seleccion la tengo con valor 0 en esos campos aun sigo haciendo la comparacion !=, sin embargo sigo sin lograr desarrollar un codigo de condiciones que me funcione bien.

Cualquier sugerencia, sigo abierto a comentarios...

De antemano gracias!!
  #8 (permalink)  
Antiguo 14/01/2016, 19:03
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 11 años, 7 meses
Puntos: 528
Respuesta: Peoblema con if anidado (no se cumplen condiciones)

if(($categoria=="Accesorios y refacciones")){
}

Esta comprobación por sí sola no hace absolutamente nada, si se cumple la condición el bloque de instrucciones está vacío.

Si quieres que dependiendo de la categoría haga tal o cual acción, y si son varias posibles categorías, te sugiero usar un switch-case:


Código PHP:
Ver original
  1. switch($categoría){
  2.    case 'Accesorios y refacciones':
  3.         //código a ejecutar cuando la categoría sea 'Accesorios y refacciones'
  4.    break;
  5.    case 'Computadoras y accesorios':
  6.         //código a ejecutar cuando la categoría sea 'Computadoras y accesorios'
  7.    break;
  8. }

Etiquetas: formulario, mysql, tabla
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 00:03.