php中带有OR条件的多个!isset()
Posted
技术标签:
【中文标题】php中带有OR条件的多个!isset()【英文标题】:multiple !isset() with OR conditions in php 【发布时间】:2019-09-22 22:33:46 【问题描述】:if(!isset($_GET['new_quiz']) || !isset($_GET['view_quiz']) || !isset($_GET['alter_quiz']))
echo "No";
else echo "Yes";
当我转到 index.php?view_quiz 时,结果应该是 Yes,但结果却是 No。为什么?
我的其他尝试:
(!isset($_GET['new_quiz'] || $_GET['view_quiz'] || $_GET['alter_quiz']))
( ! ) 致命错误:无法对表达式的结果使用 isset() (您可以改用“null !== expression”) C:\wamp\www\jainvidhya\subdomains\teacher\quiz.php 在第 94 行
(!isset($_GET['new_quiz'],$_GET['view_quiz'],$_GET['alter_quiz']))
没有
【问题讨论】:
您必须为每个 GET 参数使用 isset。正如错误消息所述,您不能将操作结果用作 isset 的参数。做isset(X) || isset(Y) 而不是 isset(X || Y) @Fitzi 那是我的第一次尝试 哦,对不起。我有点错过了第一部分。 @Firtz:错了,你可以使用isset()
和超过1 个参数。 ìsset(a,b)
是 isset(a) && isset(b)
的简写方式。或者在这里:!isset(a,b,c)
是 !isset(a) || !isset(b) || !isset(c)
的缩写形式。
检查 index.php?view_quiz=something
【参考方案1】:
您可能会发现,与反转逻辑相比,代码更易于阅读,我还喜欢对条件有更积极的看法,因为它更容易阅读(而不是几个不代表不)。
所以这表示如果有任何项目isset()
那么答案是Yes
...
if(isset($_GET['new_quiz']) || isset($_GET['view_quiz']) || isset($_GET['alter_quiz']))
echo "Yes";
else echo "No";
请注意,我已经更改了 if
的 Yes
和 No
分支。
【讨论】:
【参考方案2】:你可能正在寻找
if(!isset($_GET['new_quiz']) && !isset($_GET['view_quiz']) && !isset($_GET['alter_quiz']))
echo "No";
else
echo "Yes";
如果 URL 中没有 new_quiz、view_quiz 和 alter_quiz,则会打印 Yes。如果这不是您想要的结果,请详细说明您的问题。
【讨论】:
【参考方案3】:@paran 例如你需要为view_quiz=yes
设置一个值
if(!isset($_GET['new_quiz']) || !isset($_GET['view_quiz']) || !isset($_GET['alter_quiz']))
echo "No";
else echo "Yes";
和网址
index.php?new_quiz=yes
index.php?view_quiz=yes
index.php?alter_quiz=yes
所有都将返回 true
【讨论】:
【参考方案4】:isset()
允许多个参数。如果至少 1 个参数不存在(或为 NULL),则 isset() 返回 false
。如果所有参数都存在,isset() 返回true
。
所以试试这个:
if( !isset( $_GET['new_quiz'], $_GET['view_quiz'], $_GET['alter_quiz']) )
【讨论】:
【参考方案5】:首先,回答你的问题:
当我去 index.php?view_quiz 时,它应该给出结果为 Yes,但结果为 No。为什么?
这是因为这个
if(!isset($_GET['new_quiz']) || !isset($_GET['view_quiz']) || !isset($_GET['alter_quiz']))
检查您的任何一个参数是否未设置,只要您没有像这样同时设置所有三个参数,情况总是如此:
index.php?alter_quiz&view_quiz&new_quiz
正如@nigel-ren 所说,您可能不想将该逻辑更改为
if(isset($_GET['new_quiz']) || isset($_GET['view_quiz']) || isset($_GET['alter_quiz']))
echo 'Yes';
检查是否至少设置了一个参数。
如果您不想检查三个参数集是否只有一个,则必须使用 XOR(稍微复杂一些)
$a = isset($_GET['new_quiz']);
$b = isset($_GET['view_quiz']);
$c = isset($_GET['alter_quiz']);
if( ($a xor $b xor $c) && !($a && $b && $c) )
echo 'Yes';
(基于此答案:XOR of three values)
如果设置了三个参数中的一个且只有一个,则返回 true。
但是 - 这只是一个假设,如果我错了,请纠正我 - 我认为您想要实现的是三个不同的页面(一个用于创建测验,一个用于查看它,一个用于编辑它) .因此,您可能会遇到当前设置的问题。例如:如果用户使用多个参数调用页面会发生什么,例如
index.php?alter_quiz&view_quiz
你会显示两个页面吗?你会忽略一个参数吗?我建议首先使用单个参数来避免这个问题。例如site
可以取值alter_quiz
、view_quiz
或new_quiz
。例如:
index.php?site=alter_quiz
那么你可以这样工作:
// check if site is set before getting its value
$site = array_key_exists( 'site', $_GET ) ? $_GET['site'] : NULL;
// if it's not set e.g. index.php without parameters is called
if( is_null($site) )
// show the start page or something
else
$allowed_sites = ['new_quiz', 'view_quiz', 'alter_quiz'];
// never trust user input, check if
// site is an allowed value
if( !in_array($site, $allowed_sites, true) )
die('404 - This site is no available');
// here you can do whatever your site should do
// e.g. include another php script which contains
// your site
include('path/to/your/site-' . $site . '.php');
// or echo yes
echo 'Yes';
【讨论】:
以上是关于php中带有OR条件的多个!isset()的主要内容,如果未能解决你的问题,请参考以下文章