【问题标题】:Using if and else statements error使用 if 和 else 语句错误
【发布时间】:2013-07-26 09:22:58
【问题描述】:

我创建了两个链接,希望在其中更改页面内容。问题是 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';
}

总是输出第一个链接信息“Action”。

【问题讨论】:

    标签: php url get


    【解决方案1】:

    您的链接有问题:

    <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 pointed it out first

    此外,isset() 将返回一个布尔值(truefalse;基于变量是否设置)。您将布尔值与字符串进行比较,a string will always be converted into TRUE(除非字符串为“false”或类似的字符串),所以基本上,如果设置了变量,第一个条件将始终匹配。 p>

    你想要

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

    【讨论】:

    • 是的,把这个贴在聊天室里。哦,这很聪明:)
    • @Herbert:鉴于我的答案是(现在是)票数最高的答案,我想包括其他答案的所有优点,这样 OP 就不需要分段阅读了。
    • 是的,我是 j/k。我希望更多的人会这样做并整理一下这个地方。 :)
    • 您的 HTML 中有错字。您在Action 之后的第一行中缺少双引号
    • @byf-ferdy:你是对的。下次,请随时提出修改建议,我会接受的:)
    【解决方案2】:

    函数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;
        }
    }
    

    【讨论】:

    • @Lars Ebert 网址发生了变化,但没有任何内容作为切面输出到页面
    • @SamuelHughesMensah 我更改了链接网址,但出现了一些错误。看到这个答案:stackoverflow.com/a/17877676/2580794
    • @LarsEbert。代码 100% 正常工作。谢谢。我没有很好地复制它。对不起兄弟
    • @SamuelHughesMensah 然后将其中一个答案标记为解决方案!
    【解决方案3】:

    正如@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>
    

    【讨论】:

    • 感谢工作就像魔术
    • @SamuelHughesMensah 如果它有效,您可以接受答案。 :)
    【解决方案4】:

    确保插入一个开始和结束 php 标记:&lt;?php?&gt; 为了简化一点,您可以回显通过 $_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'];  
        }
    ?>
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 页面没有输出任何内容
      • 您应该删除链接的href 中的单引号。 ...?filter=Action.
      【解决方案6】:

      你的 if 条件不正确,这样做:

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

      与 else if 类似:

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

          • 编写此代码的最简单方法是什么。我是 PHP 新手。谢谢
          • @SamuelHughesMensah 好吧,简单的方法并不总是一个好方法,但上面的包含似乎就足够了。然后,您定义一个 FILTERS_DIR 常量,它是您放置过滤器的文件夹的名称(实际上,对于过滤器,过滤器链接是一个很好的解决方案,但现在超出了范围)。这些文件将命名为 filterName.php 并根据过滤器名称包含适当的功能。在此之前,您需要清理来自用户的请求参数,否则应用程序将容易受到基于目录遍历的攻击
          • 感谢您的提示。当我精通 PHP 时,我会使用它们,但现在在阅读其他 cmets 后,我会坚持使用 switch 语句。顺便感谢
          • @SamuelHughesMensah 不客气!然而,这并不难 :) 您只需创建一个目录,将过滤器代码放入其中,其中包含与您的过滤器名称相同的文件,例如"Action.php" 然后你 include 根据请求中的过滤器名称过滤文件。过于简化的版本只是include("filters/$_GET['filter'].php");(这里没有添加安全性和可配置性)
          【解决方案9】:

          isset 使用错误,check documentation,返回一个布尔值。

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

          【讨论】:

          • 不是一个真正的答案。只提供链接。尝试发表评论。
          • 仅链接的答案不适合 StackOverflow。它们更适合 cmets。
          • if(isset($_GET['filter'])) { switch($_GET['filter']) { case 'Action': //TODO break; case 'Comedy': // TODO break; } }
          【解决方案10】:
          //isset will always return true or false
          if(isset($_GET['filter'])){
          
              if($_GET['filter']=='Action')
              {
                  echo 'Action';
          
              }elseif($_GET['filter']=='Comedy'){
          
                  echo 'Comedy';
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 2016-07-21
            • 2012-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-18
            • 2015-01-05
            • 1970-01-01
            相关资源
            最近更新 更多