PHP 等于 $var1 或 $var2

PHP isset equal $var1 or $var2

我正在尝试制作路由系统。

我想做的事情:

Url: http://localhost/wiki.php?post_id=1 如果

调用第二个

Url 的:http://localhost/wiki.php?post_id=1&action=upvote http://localhost/wiki.php?post_id=1&action=downvote 如果

先调用

这是路由系统:

if(isset($_GET['post_id']) & ((isset($_GET['action']) ? $_GET['action'] : null) == "upvote" || "downvote")){
    //Do stuff
}else if(isset($_GET['post_id'])){
    //Do stuff
}

问题:

Url 的:http://localhost/wiki.php?post_id=1&action=upvote http://localhost/wiki.php?post_id=1&action=downvote 工作正常。

但是 url: http://localhost/wiki.php?post_id=1 调用第一个而不是第二个如果太...

Notice: Undefined index: action in D:\xampp\htdocs\controllers\WikiController.php on line 18

第 18 行:$rate = $_GET['action'];它在第一个 if 中。

在测试时我发现如果我改变 if(isset($_GET['post_id']) & ((isset($_GET['action']) ? $_GET['action'] : null) == "upvote" || "downvote")){

也是

 if(isset($_GET['post_id']) & ((isset($_GET['action']) ? $_GET['action'] : null) == "upvote")){

 if(isset($_GET['post_id']) & ((isset($_GET['action']) ? $_GET['action'] : null) == "downvote")){

它工作正常。但我想学习如何正确地做到这一点,而不仅仅是简单地制作 2 个不同的路由器。

这部分 (exp) == "upvote" || "downvote" 并不像您想象的那样工作。它只测试 exp 是否等于 "upvote",第二部分 "downvote" 被理解为一个布尔值,即 true,所以你留在替代的第一部分。 .

试试

if(isset($_GET['post_id']) && (($exp = (isset($_GET['action']) ? $_GET['action'] : null)) == "upvote" || $exp == "downvote")){

|| "downvote" 将始终 return 正确,因为您没有将它与任何东西进行比较。您也必须在该字符串前面添加 (isset($_GET['action']) ? $_GET['action'] : null) ==

所以你的声明是:

if(isset($_GET['post_id']) && ((isset($_GET['action']) ? $_GET['action'] : null) == "upvote" || (isset($_GET['action']) ? $_GET['action'] : null) == "downvote")){
    //Do stuff
}else if(isset($_GET['post_id'])){
    //Do stuff
}

为了澄清,单个(和号)& 是 "bitwise":

因此,您需要将 & 更改为 &&

来自手册:

$a & $b And Bits that are set in both $a and $b are set.

您所追求的是逻辑 && 运算符:

$a && $b And TRUE if both $a and $b are TRUE.

$routes = [
    'upvote','downvote'
    ];
    if(isset($_GET['post_id']) && isset($_GET['action']) && in_array($_GET['action'],$routes)){
       echo 'running if';
    }else if(isset($_GET['post_id'])){
      echo 'running else if';
    }

你错过了 && 是问题所在,如果你以后需要更改,我只是将其更改为动态路由!