Foros del Web » Programando para Internet » PHP »

Problema con un switch y con el operador logico "or"

Estas en el tema de Problema con un switch y con el operador logico "or" en el foro de PHP en Foros del Web. Saludos, tengo un problemilla con un switch en php, les explico un poco; en una aplicacion web, tengo un select/menu, depende de la seleccion que ...
  #1 (permalink)  
Antiguo 30/03/2011, 10:49
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Pregunta Problema con un switch y con el operador logico "or"

Saludos, tengo un problemilla con un switch en php, les explico un poco; en una aplicacion web, tengo un select/menu, depende de la seleccion que haga, la aplicacion descontara de una u otra tabla:



Si el usuario selecciona cualquiera de los que estan en azul, se descuenta de la labla "octava"; si selecciona el rojo, se descuenta de "toxicos"; ademas de tambien guardar informacion en tablas mysql.

Si selecciono cualquiera en azul, hace lo que debe, cumpliendo TODAS las condiciones indicadas para estas opciones, pero si selecciono el rojo me muestra un mensaje que no deberia de mostrar (de las condiciones); esto pasa solo cuando tengo los "or" en el switch, si dejo por ejemplo el primero "CA", la aplicacion funciona correctamente, cumpliendo todo lo requerido, ya sea toxico u octava, pero solo cuando tengo en el switch php 2 casos, es decir "CA" y "PF", en el dreamweaver no marca ningun error de sintaxis, y no veo cual es el problema, aqui esta el php: (en un comentario porque ya exedi el limite de caracteres)
  #2 (permalink)  
Antiguo 30/03/2011, 10:50
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Problema con un switch y con el operador logico "or"

Código PHP:
<?php
//Crear conexión a la Base de Datos

//Tomar los campos provenientes del Formulario


//Este script depende del checkbox (sea true o false) para funcionar
if (isset($_POST['checkbox'])):

$clave_regulacion $_POST['clave_regulacion'];
$num_permiso $_POST['num_permiso'];
$firma_descargo $_POST['firma_descargo'];
$va_com_dls $_POST['va_com_dls'];
$cantidad_umtc $_POST['cantidad_umtc'];
$fecha_actual $_POST['fecha_actual'];
$checkbox $_POST['checkbox'];

    switch (
$clave_regulacion) {

        
//REGLA OCTAVA, aqui es donde les digo que esta el problema, si lo dejo asi: case ("CA"): funciona correctamente toda la aplicacion, pero solo con 2 opciones, y son necesarias todas ellas.
        
case ("CA" || "CM" || "CP" || "C1" || "C2" || "C6" || "M6" || "AV" || "IM" || "NM"):

        
//consulta para condicionar el descuento y almacenado de las tablas (octava)
        
$consulta_octava mysql_query("SELECT * FROM octava WHERE NUM_PERMISO = '$num_permiso'");
        
$array_octava mysql_fetch_array($consulta_octava);
        
        if (
$num_permiso != $array_octava['NUM_PERMISO']):
                         
//esto es lo que me envia si dejo el php como tal, y selecciono "PF", me parece ilogico que me aparesca este mensaje si estoy introduciones valores validos y existentes
            
echo "EL NUMERO DE PERMISO NO COINSIDE CON LA BASE DE DATOS, NO SE CAPTURARA LA PARTIDA";
        
            elseif (
$array_octava['CANTIDAD_EN_NUMERO'] == "0"):
                echo 
"ESTE PERMISO YA ESTA AGOTADO, LA PARTIDA NO SE REGISTRARA. PRECIONE EL BOTON PARA REGRESAR";
                
                elseif (
$cantidad_umtc $array_octava['CANTIDAD_EN_NUMERO']):
                    echo 
"case octava NO SE PUEDE DESCONTAR UNA CANTIDAD MAYOR A LA DISPONIBLE, NO SE REGISTRARA LA PARTIDA. PRECIONE EL BOTON PARA REGRESAR";
                    
                    elseif (
$cantidad_umtc == $array_octava['CANTIDAD_EN_NUMERO']):
            
                        
// Insertar campos en la tabla
                        
$insertar mysql_query("INSERT INTO partidas (NUM_PEDIMENTO, NUM_FACTURA, SEC, FRACCION, SUBD, VINC, MET_VAL, UMC, CANTIDAD_UMC, UMT, CANTIDAD_UMT, PVC, POD, CON, TASA, TT, FP, IMPORTE, DESCRIPCION, VAL_ADUUSD, IMP_PRECIO_PAG, PRECIO_UNIT, VAL_AGRE, MARCA, MODELO, CODIGO_PRODUCTO, O_N_P, CVE_REGULACION, NUM_PERMISO, FIRMA_DESCARGO, VAL_COM_DLS, CANTIDAD_UMTC)
VALUES ('{$num_ped}', '{$numfact}', '{$sec}', '{$fraccion}', '{$subd}', '{$vinc}', '{$met_val}', '{$umc}', '{$cantidad_umc}', '{$umt}', '{$cantidad_umt}', '{$pvc}', '{$pod}', '{$con}', '{$tasa}', '{$TT}', '{$TT}', '{$importe}', '{$descripccion}', '{$val_aduusd}', '{$imp_precio_pag}', '{$precio_unit}', '{$val_agreg}', '{$marca}', '{$modelo}', '{$codigo_producto}', '{$observaciones}', '{$clave_regulacion}', '{$num_permiso}', '{$firma_descargo}', '{$va_com_dls}', '{$cantidad_umtc}')"
$conexion);
                        if (!
$insertar) {
                        die(
"Fallo en la insercion de registro en la Base de Datos: " mysql_error());
                        }

                        
$descontar mysql_query("UPDATE octava SET CANTIDAD_EN_NUMERO = CANTIDAD_EN_NUMERO - '$cantidad_umtc' WHERE NUM_PERMISO = '$num_permiso'");
                        if (!
$descontar) {
                        die(
"NO SE PUDO DESCONTAR LA CANTIDAD DEL PERMISO DE REGLA OCTAVA: " mysql_error());
                        }
                        echo 
"EN LA CAPTURA DE ESTA PARTIDA SE A AGOTADO EL PERMISO: ".$array_octava['NUM_PERMISO'].", LA PARTIDA SE A GUARDADO. PRECIONE EL BOTON PARA REGRESAR";
                            else:
                            
                                
// Insertar campos en la tabla
                                
$insertar mysql_query("INSERT INTO partidas (NUM_PEDIMENTO, NUM_FACTURA, SEC, FRACCION, SUBD, VINC, MET_VAL, UMC, CANTIDAD_UMC, UMT, CANTIDAD_UMT, PVC, POD, CON, TASA, TT, FP, IMPORTE, DESCRIPCION, VAL_ADUUSD, IMP_PRECIO_PAG, PRECIO_UNIT, VAL_AGRE, MARCA, MODELO, CODIGO_PRODUCTO, O_N_P, CVE_REGULACION, NUM_PERMISO, FIRMA_DESCARGO, VAL_COM_DLS, CANTIDAD_UMTC)
VALUES ('{$num_ped}', '{$numfact}', '{$sec}', '{$fraccion}', '{$subd}', '{$vinc}', '{$met_val}', '{$umc}', '{$cantidad_umc}', '{$umt}', '{$cantidad_umt}', '{$pvc}', '{$pod}', '{$con}', '{$tasa}', '{$TT}', '{$TT}', '{$importe}', '{$descripccion}', '{$val_aduusd}', '{$imp_precio_pag}', '{$precio_unit}', '{$val_agreg}', '{$marca}', '{$modelo}', '{$codigo_producto}', '{$observaciones}', '{$clave_regulacion}', '{$num_permiso}', '{$firma_descargo}', '{$va_com_dls}', '{$cantidad_umtc}')"
$conexion);
                                if (!
$insertar) {
                                die(
"Fallo en la insercion de registro en la Base de Datos: " mysql_error());
                                }

                                
$descontar mysql_query("UPDATE octava SET CANTIDAD_EN_NUMERO = CANTIDAD_EN_NUMERO - '$cantidad_umtc' WHERE NUM_PERMISO = '$num_permiso'");
                                if (!
$descontar) {
                                die(
"NO SE PUDO DESCONTAR LA CANTIDAD DEL PERMISO DE REGLA OCTAVA: " mysql_error());
                                }
                                echo 
"SE GUARDO LA PARTIDA SATISFACTORIAMENTE, PRECIONE EL BOTON PARA REGRESAR";
            endif;
        break;
                
        
//PERMISO DE TOXICOS
        
case "PF":
        
        
//consulta para condicionar el descuento y almacenado de las tablas (TOXICOS)
        
$consulta_toxicos mysql_query("SELECT * FROM toxicos_sustancias_peligrosas WHERE NUM_AUTORIZACION = '$num_permiso'");
        
$array_toxicos mysql_fetch_array($consulta_toxicos);
        
        if (
$num_permiso != $array_toxicos['NUM_AUTORIZACION']):
            echo 
"EL NUMERO DE AUTORIZACION NO COINCIDE CON EL DE LA BASE DE DATOS, NO SE CAPTURARA LA PARTIDA";
            
            elseif (
$array_toxicos['CANTIDAD'] == "0"):
                echo 
"ESTE PERMISO YA ESTA AGOTADO, NO SE REGISTRARA LA PARTIDA";
                
                elseif (
$cantidad_umtc $array_toxicos['CANTIDAD']):
                    echo 
"NO SE PUEDE DESCONTAR UNA CANTIDAD MAYOR A LA DISPONIBLE, NO SE REGISTRARA LA PARTIDA";
                    
                    elseif (
$cantidad_umtc == $array_toxicos['CANTIDAD']):
                    
                    
// Insertar campos en la tabla
                    
$insertar mysql_query("INSERT INTO partidas (NUM_PEDIMENTO, NUM_FACTURA, SEC, FRACCION, SUBD, VINC, MET_VAL, UMC, CANTIDAD_UMC, UMT, CANTIDAD_UMT, PVC, POD, CON, TASA, TT, FP, IMPORTE, DESCRIPCION, VAL_ADUUSD, IMP_PRECIO_PAG, PRECIO_UNIT, VAL_AGRE, MARCA, MODELO, CODIGO_PRODUCTO, O_N_P, CVE_REGULACION, NUM_PERMISO, FIRMA_DESCARGO, VAL_COM_DLS, CANTIDAD_UMTC)
VALUES ('{$num_ped}', '{$numfact}', '{$sec}', '{$fraccion}', '{$subd}', '{$vinc}', '{$met_val}', '{$umc}', '{$cantidad_umc}', '{$umt}', '{$cantidad_umt}', '{$pvc}', '{$pod}', '{$con}', '{$tasa}', '{$TT}', '{$TT}', '{$importe}', '{$descripccion}', '{$val_aduusd}', '{$imp_precio_pag}', '{$precio_unit}', '{$val_agreg}', '{$marca}', '{$modelo}', '{$codigo_producto}', '{$observaciones}', '{$clave_regulacion}', '{$num_permiso}', '{$firma_descargo}', '{$va_com_dls}', '{$cantidad_umtc}')"
$conexion);
                    if (!
$insertar) {
                    die(
"Fallo en la insercion de registro en la Base de Datos: " mysql_error());
                    }
                    
                    
$descontar mysql_query("UPDATE toxicos_sustancias_peligrosas SET CANTIDAD = CANTIDAD - '$cantidad_umtc' WHERE NUM_AUTORIZACION = '$num_permiso'");
                    if (!
$descontar) {//falta condicion para fechas
                    
die("NO SE PUDO DESCONTAR LA CANTIDAD DEL PERMISO DE SUSTANCIAS PELIGROSAS: " mysql_error());
                    }
                    echo 
"EN LA CAPTURA DE ESTA PARTIDA SE A AGOTADO EL PERMISO: ".$array_toxicos['NUM_AUTORIZACION'].", LA PARTIDA SE A GUARDADO. PRECIONE EL BOTON PARA REGRESAR";
                        else:
                            
                            
$insertar mysql_query("INSERT INTO partidas (NUM_PEDIMENTO, NUM_FACTURA, SEC, FRACCION, SUBD, VINC, MET_VAL, UMC, CANTIDAD_UMC, UMT, CANTIDAD_UMT, PVC, POD, CON, TASA, TT, FP, IMPORTE, DESCRIPCION, VAL_ADUUSD, IMP_PRECIO_PAG, PRECIO_UNIT, VAL_AGRE, MARCA, MODELO, CODIGO_PRODUCTO, O_N_P, CVE_REGULACION, NUM_PERMISO, FIRMA_DESCARGO, VAL_COM_DLS, CANTIDAD_UMTC)
VALUES ('{$num_ped}', '{$numfact}', '{$sec}', '{$fraccion}', '{$subd}', '{$vinc}', '{$met_val}', '{$umc}', '{$cantidad_umc}', '{$umt}', '{$cantidad_umt}', '{$pvc}', '{$pod}', '{$con}', '{$tasa}', '{$TT}', '{$TT}', '{$importe}', '{$descripccion}', '{$val_aduusd}', '{$imp_precio_pag}', '{$precio_unit}', '{$val_agreg}', '{$marca}', '{$modelo}', '{$codigo_producto}', '{$observaciones}', '{$clave_regulacion}', '{$num_permiso}', '{$firma_descargo}', '{$va_com_dls}', '{$cantidad_umtc}')"
$conexion);
                            if (!
$insertar) {
                            die(
"Fallo en la insercion de registro en la Base de Datos: " mysql_error());
                            }
                    
                            
$descontar mysql_query("UPDATE toxicos_sustancias_peligrosas SET CANTIDAD = CANTIDAD - '$cantidad_umtc' WHERE NUM_AUTORIZACION = '$num_permiso'");
                            if (!
$descontar) {//falta condicion para fechas
                            
die("NO SE PUDO DESCONTAR LA CANTIDAD DEL PERMISO DE SUSTANCIAS PELIGROSAS: " mysql_error());
                            }
                            echo 
"SE GUARDO LA PARTIDA SATISFACTORIAMENTE, PRECIONE EL BOTON PARA REGRESAR";
            endif;        
        break;
    
//cierre del switch ($clave_regulacion)
    
}

//si no se activa el checbox, guarda sin tomar los datos de REGULACIONES, RESTRICCIONES bla bla bla
else:

    
$insertar mysql_query("INSERT INTO partidas (NUM_PEDIMENTO, NUM_FACTURA, SEC, FRACCION, SUBD, VINC, MET_VAL, UMC, CANTIDAD_UMC, UMT, CANTIDAD_UMT, PVC, POD, CON, TASA, TT, FP, IMPORTE, DESCRIPCION, VAL_ADUUSD, IMP_PRECIO_PAG, PRECIO_UNIT, VAL_AGRE, MARCA, MODELO, CODIGO_PRODUCTO, O_N_P)
VALUES ('{$num_ped}', '{$numfact}', '{$sec}', '{$fraccion}', '{$subd}', '{$vinc}', '{$met_val}', '{$umc}', '{$cantidad_umc}', '{$umt}', '{$cantidad_umt}', '{$pvc}', '{$pod}', '{$con}', '{$tasa}', '{$TT}', '{$TT}', '{$importe}', '{$descripccion}', '{$val_aduusd}', '{$imp_precio_pag}', '{$precio_unit}', '{$val_agreg}', '{$marca}', '{$modelo}', '{$codigo_producto}', '{$observaciones}')"
$conexion);
    if (!
$insertar) {
    die(
"Fallo en la insercion de registro en la Base de Datos: " mysql_error());
}
    echo 
"PARTIDA GUARDADA SIN NINGUN PERMISO, PRECIONE EL BOTON PARA REGRESAR";
endif;

mysql_close($conexion);
?>
  #3 (permalink)  
Antiguo 30/03/2011, 10:50
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Problema con un switch y con el operador logico "or"

¿Y el código?
Edito: ups escribia mientras publicabas el código

Edito2:
Yo no tuve problemas en usar ||
Código PHP:
Ver original
  1. <?php
  2. $str = 'bar';
  3. switch($str){
  4.     case ('foo' || 'bar' || 'candy'):
  5.         echo 'foo | bar | candy';
  6.         break;
  7.     case 'fruits' || 'vegetable':
  8.         echo 'fruits | vegetable';
  9.         break;
  10.     default:
  11.         echo 'N/A';
  12. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 30/03/2011 a las 10:56
  #4 (permalink)  
Antiguo 30/03/2011, 11:11
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Problema con un switch y con el operador logico "or"

mmm, entonces cual puede ser el problema?
  #5 (permalink)  
Antiguo 30/03/2011, 11:27
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Problema con un switch y con el operador logico "or"

Que diferencia hay de esto:

Código PHP:
  switch ($clave_regulacion) {
case (
"CA" || "CM" || "CP" || "C1" || "C2" || "C6" || "M6" || "AV" || "IM" || "NM"):
//resto del codigo 
A esto:

Código PHP:
  switch ($clave_regulacion) {
case (
$clave_regulacion == "CA" || $clave_regulacion ==  "CM" || $clave_regulacion ==  "CP" || $clave_regulacion ==  "C1" || $clave_regulacion ==  "C2" || $clave_regulacion ==  "C6" || $clave_regulacion ==  "M6" || $clave_regulacion ==  "AV" || $clave_regulacion ==  "IM" || $clave_regulacion ==  "NM"):
//resto del codigo 
Aqui estoy siendo mas especifico o que?, pregunto porque asi es como me funciono TODO, apenas se me acaba de ocurrir, aunque la verdad pense que no funcionaria.

Por lo menos si me gustaria saber por qué si funciona de la segunda manera, y no de la primera.
  #6 (permalink)  
Antiguo 30/03/2011, 11:31
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Problema con un switch y con el operador logico "or"

Estas haciendo verificaciones innecesarias. Mejor depura tus consultas, tal vez tengas algún error en ellas. Usa mysql_error()
Código PHP:
Ver original
  1. mysql_query('aqui va tu consulta') or die(mysql_error());
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 30/03/2011, 11:44
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 9 meses
Puntos: 155
Respuesta: Problema con un switch y con el operador logico "or"

checa segun el manual para hacer un or con un switch

se hace de esta forma

Código PHP:
<?php
switch ($i) {
case 
0:
case 
1:
case 
2:
    echo 
"i es menor que 3 pero no negativo";
    break;
case 
3:
    echo 
"i es 3";
}
?>
http://php.net/manual/es/control-structures.switch.php
  #8 (permalink)  
Antiguo 30/03/2011, 11:50
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Problema con un switch y con el operador logico "or"

Te refieres a estas?:

Código PHP:
 //consulta para condicionar el descuento y almacenado de las tablas (TOXICOS) 
        
$consulta_toxicos mysql_query("SELECT * FROM toxicos_sustancias_peligrosas WHERE NUM_AUTORIZACION = '$num_permiso'"); 
        
$array_toxicos mysql_fetch_array($consulta_toxicos); 
         
        if (
$num_permiso != $array_toxicos['NUM_AUTORIZACION']): 
            echo 
"EL NUMERO DE AUTORIZACION NO COINCIDE CON EL DE LA BASE DE DATOS, NO SE CAPTURARA LA PARTIDA"
             
            elseif (
$array_toxicos['CANTIDAD'] == "0"): 
                echo 
"ESTE PERMISO YA ESTA AGOTADO, NO SE REGISTRARA LA PARTIDA"
                 
                elseif (
$cantidad_umtc $array_toxicos['CANTIDAD']): 
                    echo 
"NO SE PUEDE DESCONTAR UNA CANTIDAD MAYOR A LA DISPONIBLE, NO SE REGISTRARA LA PARTIDA"
Todo lo que esta ahi es necesario, por ejemplo si no esta este: elseif ($cantidad_umtc > $array_toxicos['CANTIDAD']): seguira descontando hasta numeros negativos, igual con este elseif ($array_toxicos['CANTIDAD'] == "0"):.

En fin, no hay ningun error con las consultas, de hecho me olvide de poner el mysql_error, gracias por recordarmelo.

Lo que hice para que la aplicacion funcione correctamente, al %100 (bueno, por lo menos solo esta parte, la captura de partidas) fue poner asi el switch:

Código PHP:
  switch ($clave_regulacion) {
case (
$clave_regulacion == "CA" || $clave_regulacion ==  "CM" || $clave_regulacion ==  "CP" || $clave_regulacion ==  "C1" || $clave_regulacion ==  "C2" || $clave_regulacion ==  "C6" || $clave_regulacion ==  "M6" || $clave_regulacion ==  "AV" || $clave_regulacion ==  "IM" || $clave_regulacion ==  "NM"):
//resto del codigo 
Por lo pronto ya quedo resuelto este problemilla. Gracias por auxiliarme.
  #9 (permalink)  
Antiguo 30/03/2011, 11:53
Avatar de omar_gutierrez  
Fecha de Ingreso: febrero-2011
Mensajes: 144
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Problema con un switch y con el operador logico "or"

Gracias mogurbon, aunque no es la unica forma de hacer un switch segun el manual (ya lo habia leido), de hecho mas al fondo hay un ejemplo con "or"

Etiquetas: logicos, operadores, switch
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 13:44.