C'est peut-être la façon dont mon serveur est configuré, mais je me tape la tête contre le mur. Ce que j'essaie de faire, c'est de dire que si $action
N'a pas de valeur ou a une valeur qui n'est ni "ajouter" ni "supprimer" que d'avoir une autre erreur, continuez à exécuter le script. Cependant, j'obtiens une erreur quel que soit $action
.
$action= $_GET['a'];
if((!isset($action)) || ($action !="add" || $action !="delete") ){
//header("location:index.php");
echo "error <br>";
}
$action
Est correctement défini et si vous exécutez quelque chose comme if($action =="add")
cela fonctionne. C'est sur mon hôte local, donc cela pourrait être un problème de configuration.
Votre logique est légèrement décalée. Le deuxième ||
Devrait être &&
:
if ((!isset($action)) || ($action != "add" && $action != "delete"))
Vous pouvez voir pourquoi votre ligne d'origine échoue en essayant un exemple de valeur. Disons que $action
Est "delete"
. Voici comment la condition diminue progressivement:
// $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)
Oups! La condition a juste réussi et a imprimé "erreur", mais elle était supposée échouer. En fait, si vous y réfléchissez, quelle que soit la valeur de $action
, L'un des deux tests !=
Retournera vrai. Basculez le ||
Sur &&
, Puis l'avant-dernière ligne devient if (true && false)
, qui se réduit correctement à if (false)
.
Il y a un moyen d'utiliser ||
Et d'avoir le travail de test, soit dit en passant. Vous devez nier tout le reste en utilisant loi de De Morgan , c'est-à-dire:
if ((!isset($action)) || !($action == "add" || $action == "delete"))
Vous pouvez lire cela en anglais comme "si l'action n'est pas (ajouter ou supprimer), alors".
Quelle que soit l'action $, elle ne sera toujours pas "add" OR ne sera pas "delete", c'est pourquoi la condition if passe toujours. Ce que vous voulez, c'est utiliser && au lieu de ||:
(!isset($action)) || ($action !="add" && $action !="delete"))
Vous dites "si ce n'est pas défini ou si c'est différent de l'ajout ou si c'est différent de la suppression". Vous vous rendez compte que a != x && a != y
, avec x != y
est nécessairement false
car a
ne peut pas être simultanément deux valeurs différentes.
Vous pouvez également essayer:
if ((!isset($action)) || !($action == "add" || $action == "delete")) {
// Do your stuff
}
pour référence future, vous pouvez rapidement créer une table de vérité pour vérifier si elle évalue la façon dont vous le souhaitez ... c'est un peu comme le sudoku.
(!isset($action)) && ($action !="add" && $action !="delete"))
exemple:
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
if( !( isset($action) && ($action =="add" || $action =="delete" )) )
Je pense que c'est la meilleure façon de le faire
pas une réponse mais juste pour le formatage du code
if((isset($_GET['a'])) $action=$_GET['a']; else $action ="";
if(!($action === "add" OR $action === "delete")){
header("location: /index.php");
exit;
}
remarque exit;
instruction après l'en-tête (). c'est une chose importante. header () ne termine pas l'exécution du script