2010-07-31 12 views
8

Esta puede ser la forma en que mi servidor está configurado, pero estoy golpeando mi cabeza contra la pared. Lo que trato de hacer es decir que si $action no tiene valor o tiene un valor que no es "agregar" o "eliminar" que tener un error, de lo contrario, siga ejecutando el script. Sin embargo, recibo un error sin importar lo que $action es.php if not statements

$action= $_GET['a']; 
if((!isset($action)) || ($action !="add" || $action !="delete")){ 
    //header("location:index.php"); 
    echo "error <br>"; 
} 

$action se está estableciendo correctamente y si se ejecuta algo así como if($action =="add") funciona. Esto está en mi host local, por lo que podría ser un problema de configuración.

+1

no hay sentido en la comprobación de si se ha establecido la acción $, si se establece en la línea anterior –

+0

metralla, si no hay nada en la parte '"? a = xxx "' de la url '$ action' debe ser nula. Creo que si estuviera configurando '$ action' en una variable estática, estarías en lo cierto. Sin embargo, dado que el usuario ingresa datos, existe la posibilidad de que surjan problemas. Corrígeme si estoy equivocado. – BandonRandon

+0

oops, mi mal. isset() devuelve falso en variables nulas. De todos modos, debe verificar si $ _GET ['a'] estableció, no $ acción. O obtendrá un error de "Índice no definido". –

Respuesta

17

Su lógica está un poco apagada. El segundo || debería ser &&:

if ((!isset($action)) || ($action != "add" && $action != "delete")) 

Se puede ver por qué su línea original falla al probar un valor de muestra. Digamos que $action es "delete". Así es como la condición reduce abajo paso a paso:

// $action == "delete" 
if ((!isset($action)) || ($action != "add" || $action != "delete")) 
if ((!true) || ($action != "add" || $action != "delete")) 
if (false || ($action != "add" || $action != "delete")) 
if ($action != "add" || $action != "delete") 
if (true || $action != "delete") 
if (true || false) 
if (true) 

Ups! La condición simplemente tuvo éxito e imprimió "error", pero se suponía que fallaría. De hecho, si lo piensa, no importa cuál sea el valor de $action, una de las dos pruebas != devolverá verdadero. Cambie el || al && y luego la penúltima línea se convierte en if (true && false), que se reduce correctamente a if (false).

Hay una forma de usar || y hacer que la prueba funcione, por cierto. Usted tiene que negar todo lo demás usando De Morgan's law, es decir .:

if ((!isset($action)) || !($action == "add" || $action == "delete")) 

Puede leído en Inglés como "si la acción no es (ya sea agregar o quitar), luego".

1

Está diciendo "si no está configurado o es diferente de agregar o es diferente de eliminar". Se da cuenta de que a != x && a != y, con x != y es necesariamente false ya que a no pueden ser simultáneamente dos valores diferentes.

8

No importa qué $ action sea, siempre no será "add" O no será "delete", por lo que la condición if siempre pasa. Lo que se quiere es utilizar & & en lugar de ||:

(!isset($action)) || ($action !="add" && $action !="delete")) 
+0

lo siento, no creo que este sea el camino correcto –

+0

@dumbledor Creo que esta fue la forma más fácil de modificar mi código original y explicar lo que hice mal. – BandonRandon

0

para futuras consultas, puede crear rápidamente una tabla de verdad para comprobar si se evalúa la forma en que quiere ... es algo así como el sudoku.

(!isset($action)) && ($action !="add" && $action !="delete"))

ejemplo:

column 1 is issetaction, column 2 and 3 evaluates !="add","delete" respectively

if($a=add) T && (F && T) => T && F => FALSE

if($a=delete) T && (T && F) => T && F => FALSE

if($a=nothing) T && (T && T) => T && T => TRUE

0
if(!(isset($action) && ($action =="add" || $action =="delete"))) 


Creo que esta es la mejor y más fácil manera de hacerlo

0

no una respuesta, pero sólo en aras de código formateo

if((isset($_GET['a'])) $action=$_GET['a']; else $action =""; 
if(!($action === "add" OR $action === "delete")){ 
    header("location: /index.php"); 
    exit; 
} 

nota exit; instrucción después del encabezado(). eso es algo importante header() no interrumpir la ejecución del script

2

También puede probar:

if ((!isset($action)) || !($action == "add" || $action == "delete")) { 
    // Do your stuff 
}