使用 if 和 else 语句错误


Using if and else statements error

我创建了两个链接,我希望在其中更改页面内容。问题是URL更改,而不是页面内容。

<h3>Filter Results</h3>
<p><a href="index.php?filter='Action'>Action</a></p>
<p><a href="index.php?filter='Comedy'">Comedy</a></p>
if (isset($_GET['filter']) == 'Action') {
    echo 'Action';  
}
else if (isset($_GET['filter']) =='Comedy') {    
    echo 'Comedy';
}

它始终输出第一个链接信息"操作"。

您的链接有问题:

<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
<!--                         ^    ^ No single quotes (' ') -->

Yogesh Suthar首先指出了这一点

此外, isset()将返回一个布尔值(truefalse;基于变量是否被设置(。您将布尔值与字符串进行比较,字符串将始终转换为TRUE (除非字符串为"false"或类似(,因此基本上,如果设置了变量,则第一个条件将始终匹配。

你想要

if (isset($_GET["filter"]) && $_GET["filter"] === "Action")

注意使用 === ,这将确保变量与您认为的完全一样,而不是某种其他类型的变量。

还有几点(从其他答案中无耻地偷来的(

  • 如果有多个可能的过滤器,请检查变量是否存在一次,并使用switch/case块来确定它是其中的哪个:

    if(isset($_GET['filter'])) {
        switch($_GET['filter']) {
            case 'Action':
                echo 'Action';
                break;
            case 'Comedy':
                echo 'Comedy';
                break;
        }
    }
    

函数isset只会检查变量是否存在!它不会返回其值!试试这个:

<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter']) && $_GET['filter'] == 'Action'){
    echo 'Action';  
}
else if(isset($_GET['filter']) && $_GET['filter'] == 'Comedy') {
    echo 'Comedy';
}

此外,使用 switch 可能会使将来的事情变得更容易:

<h3>Filter Results</h3>
<p><a href="index.php?filter=Action">Action</a></p>
<p><a href="index.php?filter=Comedy">Comedy</a></p>
if(isset($_GET['filter'])) {
    switch($_GET['filter']) {
        case 'Action':
            echo 'Action';
            break;
        case 'Comedy':
            echo 'Comedy';
            break;
    }
}

正如@MadaraUchiha所说的isset和,

if(isset($_GET['filter']) == 'Action')

应该是

if(isset($_GET['filter']) && $_GET['filter'] == 'Action')

<a href="index.php?filter='Action'>Action</a>
        ^                 ^      ^ // here you started " but not ended and remove the single quotes around Action

应该是

<a href="index.php?filter=Action">Action</a>

确保插入一个开始和一个结束的 php 标签: <?php?> 为了简化它,你可以回显你通过$_GET获得的值

<h3>Filter Results</h3>
<p><a href="index.php?filter='Action'>Action</a></p>
<p><a href="index.php?filter='Comedy'>Comedy</a></p>
<?php
    if(isset($_GET['filter'])){
        echo $_GET['filter'];  
    }
?>

函数isset将返回true或false(它检查变量是否设置(。更改您的代码:

if(isset($_GET['filter']) && $_GET['filter'] == 'Action') {

您的 if 条件不正确,请执行此操作:

if(isset($_GET['filter']) && $_GET['filter'] == 'Action'){
  echo 'Action';  
}

与 else 类似,如果:

else if(isset($_GET['filter']) && $_GET['filter'] =='Comedy') {

当您将isset($_GET['filter'])与值进行比较时,尽管 isset 返回 true 的 false 因此您需要比较 $_GET['filter'] 的值。

你不必使用isset((然后进行比较。

$filter = $_GET['filter'];
if(isset($filter)){
   if($filter == 'Action'){
     echo 'Action';
   }else if($filter == 'Comedy'){
     echo 'Comedy';
   }
}

isset返回true并且由于'Action'不是null,因此它的计算结果为true。

if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Action')) {
    // ...
} else if ((isset($_GET['filter'])) && ($_GET['filter'] == 'Comedy')) {
    // ...
}

顺便说一句,这样的代码迟早会成为维护的噩梦。

例如,您可以改为

function preventDirectoryTraversal($requestParam) {
    return preg_replace("/'//", "", $requestParam);
}
// ...
if (isset($_GET['filter'])) {
    $filterName = preventDirectoryTraversal($_GET['filter']);
    include(FILTERS_DIR . "/" .  $filterName . ".php");
}

或类似的东西。当然,这可以进一步改进,但我希望你明白这一点。

错误使用 isset,检查文档,返回布尔值。

if (isset($_GET['filter']))
{
    switch ($_GET['filter'])
    {
        case 'Action':
            //TODO
            break;
        case 'Comedy':
            // TODO
            break;
        default:
            // TODO
            break;
    }
}
//isset will always return true or false
if(isset($_GET['filter'])){
    if($_GET['filter']=='Action')
    {
        echo 'Action';
    }elseif($_GET['filter']=='Comedy'){
        echo 'Comedy';
    }
}