web-dev-qa-db-ja.com

php if notステートメント

これが私のサーバーのセットアップ方法かもしれませんが、私は頭を壁にぶつけています。私がやろうとしているのは、_$action_に値がないか、「追加」または「削除」ではない値がある場合、エラーが発生してスクリプトを実行し続けるということです。ただし、_$action_が何であってもエラーが発生します。

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

_$action_は適切に設定されており、if($action =="add")のようなものを実行すると動作します。これはローカルホスト上にあるため、設定の問題になる可能性があります。

13
Brooke.

あなたのロジックは少しずれています。 2番目の_||_は_&&_である必要があります。

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

サンプル値を試してみると、元の行が失敗する理由を確認できます。 _$action_が_"delete"_だとしましょう。以下に、条件が段階的に減少する方法を示します。

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

おっとっと!条件は成功し、「エラー」を出力しましたが、失敗するはずでした。実際、それについて考えると、_$action_の値が何であっても、2つの_!=_テストの1つはtrueを返します。 _||_を_&&_に切り替えると、最後から2番目の行がif (true && false)になり、if (false)に適切に縮小されます。

ちなみに_||_を使用してテストを実行する方法があります。 De Morganの法則 を使用して、他のすべてを無効にする必要があります。

_if ((!isset($action)) || !($action == "add" || $action == "delete"))
_

英語では、「アクションが(追加または削除のいずれでもない)場合」と読むことができます。

25
John Kugelman

$ actionが何であっても、常に「add」ではないORではなく「delete」であるため、if条件は常に合格します。 ||:

(!isset($action)) || ($action !="add" && $action !="delete"))
10
Jeremy Ruten

「設定されていない場合、追加と異なる場合、または削除と異なる場合」と言っています。 a != x && a != yx != yは必然的にfalseであることに気付きます。これは、aを同時に2つの異なる値にすることはできないためです。

3
Artefacto

また試すことができます:

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


私はこれが最良かつ最も簡単な方法だと思います

0
Amit Sharma

答えではなく、単にコードの書式設定のため

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

注意 exit; header()の後のステートメント。それは重要なことです。 header()はスクリプトの実行を終了しません

0