これが私のサーバーのセットアップ方法かもしれませんが、私は頭を壁にぶつけています。私がやろうとしているのは、_$action
_に値がないか、「追加」または「削除」ではない値がある場合、エラーが発生してスクリプトを実行し続けるということです。ただし、_$action
_が何であってもエラーが発生します。
_ $action= $_GET['a'];
if((!isset($action)) || ($action !="add" || $action !="delete") ){
//header("location:index.php");
echo "error <br>";
}
_
_$action
_は適切に設定されており、if($action =="add")
のようなものを実行すると動作します。これはローカルホスト上にあるため、設定の問題になる可能性があります。
あなたのロジックは少しずれています。 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"))
_
英語では、「アクションが(追加または削除のいずれでもない)場合」と読むことができます。
$ actionが何であっても、常に「add」ではないORではなく「delete」であるため、if条件は常に合格します。 ||:
(!isset($action)) || ($action !="add" && $action !="delete"))
「設定されていない場合、追加と異なる場合、または削除と異なる場合」と言っています。 a != x && a != y
でx != y
は必然的にfalse
であることに気付きます。これは、a
を同時に2つの異なる値にすることはできないためです。
また試すことができます:
if ((!isset($action)) || !($action == "add" || $action == "delete")) {
// Do your stuff
}
if( !( isset($action) && ($action =="add" || $action =="delete" )) )
私はこれが最良かつ最も簡単な方法だと思います
答えではなく、単にコードの書式設定のため
if((isset($_GET['a'])) $action=$_GET['a']; else $action ="";
if(!($action === "add" OR $action === "delete")){
header("location: /index.php");
exit;
}
注意 exit;
header()の後のステートメント。それは重要なことです。 header()はスクリプトの実行を終了しません