2010-07-31 17 views
8

Questo potrebbe essere il modo in cui è configurato il mio server ma sto sbattendo la testa contro il muro. Quello che sto cercando di fare è dire che se $action non ha valore o ha un valore che non è "aggiungi" o "cancella" di un errore, continua a eseguire lo script. Tuttavia, ottengo un errore, non importa quale sia lo $action.php se non dichiarazioni

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

$action è stato impostato correttamente e se eseguire qualcosa di simile if($action =="add") funziona. Questo è sul mio host locale, quindi potrebbe essere un problema di impostazione.

+1

non v'è alcun senso di verificare se è impostato $ azione, se si imposta sulla linea precedente –

+0

Shrapnel, se non è in la parte "? a = xxx" 'dell'URL' $ action' dovrebbe essere nullo. Penso che se impostassi '$ action' su una variabile statica avresti ragione. Tuttavia, poiché l'utente inserisce i dati, c'è una possibilità di problemi. Correggimi se sbaglio. – BandonRandon

+0

oops, mio ​​male. isset() restituisce false su variabili nulle. Ad ogni modo dovresti controllare se $ _GET ['a'] set, non $ action. O otterrai l'errore "Indice non definito". –

risposta

17

La logica è leggermente disattivata. Il secondo dovrebbe essere ||&&:

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

Si può capire perché la vostra linea originale non riesce provando un valore di esempio. Diciamo che $action è "delete". Ecco come si riducono le condizioni passo dopo passo:

// $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) 

Oops! La condizione ha avuto successo e ha stampato "errore", ma avrebbe dovuto fallire. Infatti, se ci pensate, indipendentemente dal valore di $action, uno dei due test != restituirà true. Passare || a && e quindi la penultima riga diventa if (true && false), che si riduce correttamente a if (false).

C'è un modo di utilizzare || e il lavoro di test, tra l'altro. Devi negare tutto il resto utilizzando De Morgan's law, cioè .:

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

si legge che in inglese come "se l'azione non è (aggiungere o rimuovere), poi".

1

Stai dicendo "se non è impostato o è diverso dall'aggiunta o è diverso dall'eliminazione". Ti rendi conto che a != x && a != y, con x != y è necessariamente false dal a non può essere contemporaneamente due valori diversi.

8

Indipendentemente dall'azione $, non sarà sempre "add" O non essere "delete", motivo per cui la condizione if passa sempre. Ciò che si vuole è quella di utilizzare & & invece di ||:

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

scusate, non credo che questo sia il modo giusto –

+0

@dumbledor Penso che questo sia il modo più semplice per modificare il mio codice originale e spiegare cosa ho sbagliato. – BandonRandon

0

per riferimento futuro, è possibile creare rapidamente una tabella di verità per verificare se si valuta il modo in cui si desidera ... è un po 'come sudoku.

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

esempio:

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"))) 


Credo che questo sia il modo migliore e più semplice per farlo

0

non è una risposta, ma solo nel gusto di codice formattazione

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

nota exit; istruzione dopo intestazione(). questa è la cosa importante header() non interrompere l'esecuzione di script

2

Si potrebbe anche provare:

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