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"; 

请注意,我已经更改了 ifYesNo 分支。

【讨论】:

【参考方案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_quizview_quiznew_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()的主要内容,如果未能解决你的问题,请参考以下文章

是否有完美的方法来检查 isset 和 is_numeric 1 条件

实体框架中带有 OR 条件的动态查询

函数中带有静态变量的竞争条件

查询条件中带有“/”的 Lucene 查询解析器

Python中带有AND条件的LOC搜索字符串

条件字符串中带有符号的 Codeigniter 查询