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';
}
你错过了 && 是问题所在,如果你以后需要更改,我只是将其更改为动态路由!
我正在尝试制作路由系统。
我想做的事情:
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';
}
你错过了 && 是问题所在,如果你以后需要更改,我只是将其更改为动态路由!