web-dev-qa-db-fra.com

php sinon déclarations

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.

13
Brooke.

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

25
John Kugelman

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"))
10
Jeremy Ruten

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.

3
Artefacto

Vous pouvez également essayer:

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

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

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


Je pense que c'est la meilleure façon de le faire

0
Amit Sharma

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

0
Your Common Sense