2013-04-29 64 views
1

- 让我添加此。此代码适用于我的方式。我只是不知道它为什么会起作用.--案件isset未触发案件isset触发

我无法弄清楚这一点。

switch ($_SERVER['QUERY_STRING']) { 
case isset($_GET['test0']): 
    echo "test0<br>"; 
    break; 
case isset($_GET['test1']): 
    echo "test1<br>"; 
    break; 
case isset($_GET['test2']): 
    echo "test2<br>"; 
    break; 
case isset($_GET['test3']): 
    echo "test3<br>"; 
    break; 
case isset($_GET['test4']): 
    echo "test4<br>"; 
    break; 
default: 
    echo "no test<br>"; 
    break; 
} 

当url为index.php?test0时,显示“test0”。

当url为index.php?test4时,显示“test4”。

当url为index.php?test999时,显示“no test”。

当url为index.php?tes时,显示“no test”。

当url为index.php?或index.php时,显示“test0”。

这是为什么?条件不符合,所以默认不应该显示?

+0

你到底想干什么?如果'index.php?test0'是url?那么,你用什么'switch'来回声呢? ...我只是想了解你的问题 – samayo 2013-04-29 17:42:39

+0

好吧,它做我需要它做的事情。如果我使用test3,则回声测试3。如果?条件错误,它会回应默认值。我只是不知道它是什么触发第一个案件时,没有?条件是在网址中。 – JSP254 2013-04-29 17:53:13

+0

我试过我的代码,它的工作原理。虽然 – samayo 2013-04-29 18:14:49

回答

2

switch不能用这种方式。 isset()返回true或false,而不是可匹配的东西(字符串,int等)。你基本上做的是:

switch ($_SERVER['QUERY_STRING']) { 
    case true: 
     echo "test0<br>"; 
     break; 
    case true: 
     echo "test1<br>"; 
     break; 
    case false: 
     echo "test2<br>"; 
     break; 
    case false: 
     echo "test3<br>"; 
     break; 
    case true: 
     echo "test4<br>"; 
     break; 
    default: 
     echo "no test<br>"; 
     break; 
} 

case s是从上到下考虑。在这种情况下,$ _SERVER [“QUERY_STRING”]会自动类型转换为bool(在这种情况下将返回true)。它看到的第一个案例是test0,所以它反映了这一点。如果你这样做了test0-4,它会给你错误的幻觉,认为这段代码是按照预期工作的,而它不考虑边缘情况。

您可以通过使用多个ifs或重新设计您的应用程序来实现您想要的唯一方法。

+0

可能会有点激进,但它确实有效。如果url是?test1,?test3等。如果使用了?notacase,默认情况下会启用。我只是想知道如果不使用?条件,如何使用第一种情况。 – JSP254 2013-04-29 17:38:15

+0

@ JSP254它实际上不应该与任何东西匹配,并直接跳转到您提到的任何测试用例的默认值,因为您将字符串与true/false的情况进行了匹配。 – tyteen4a03 2013-04-29 17:42:13

+0

我不知道它为什么会这样做,但它确实如此。 – JSP254 2013-04-29 18:03:08

0

怎么样

$found = false; 
for($i=0;$i <=4; $i++){ 
    if(isset($_GET['test'.$i])){ 
     echo "test".$i; 
     $found = true; 
    } 
} 

if(!$found){ 
    echo "no test"; 
} 
+0

ummm。不确定兄弟。原始代码做我需要做的事情。试图找出原因。 – JSP254 2013-04-29 18:06:43

0

这能够完成任务了。

<?php 

$q = $_SERVER['QUERY_STRING']; 

    if(!empty($q) && isset($q) && strlen($q) >0){ 
     $url = $q; 

     switch ($url){ 
      case true; 
      echo $url; 
      break; 
      } 
     } 

    else { 
    echo "no test<br>"; 
    } 
1

当URL是的index.php?,或的index.php “TEST0” 被示出。

这是为什么?条件不符合,所以默认不应该显示?

就像一个很好的问题,你的问题也包含答案。

您已经意识到,即使您认为不符合条件,也必须满足条件。所以你问。所以,让我们来看看其中的条件是:

case isset($_GET['test0']): 
    echo "test0<br>"; 
    break; 

这是isset($_GET['test0'])测试,我们知道有这是FALSE请求。所以这个测试测试FALSE

现在让我们看看对这个有什么测试:

switch ($_SERVER['QUERY_STRING']) { 

也就是说$_SERVER['QUERY_STRING']。所以如果$_SERVER['QUERY_STRING']FALSEtest0将被输出。

因为PHP中的switch { case:}没有宽松的比较,空字符串$_SERVER['QUERY_STRING']FALSE。这就是你看到输出的原因。

容易,如果你知道为什么,对吧?而且都非常合乎逻辑。

你想测试对不$_SERVER['QUERY_STRING']只是TRUE什么:

switch (TRUE) 
{ 
    case isset($_GET['test0']) : 
    ... 
}