1

——让我补充一下。这段代码按原样对我有用。我只是不知道它为什么起作用。-

我想不通。

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 时,显示“未测试”。

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

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

为什么是这样?条件不满足,那么不​​应该显示默认吗?

4

4 回答 4

2

switch不能这样使用。isset()返回真或假,而不是您可以匹配的东西(字符串、整数等)。你基本上在做的是:

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

cases 是从上到下考虑的。在这种情况下,$_SERVER["QUERY_STRING"] 会自动类型转换为 bool(在这种情况下将返回 true)。它看到的第一个案例是 test0,所以它回应了这一点。如果你对 test0-4 这样做,它会给你一种错误的错觉,即这段代码正在按预期工作,而它没有考虑边缘情况。

实现您想要的唯一方法是使用多个 if,或者重新设计您的应用程序。

于 2013-04-29T17:32:50.150 回答
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被输出。

因为switch { case:}在 PHP 中进行松散比较,所以空字符串$_SERVER['QUERY_STRING']FALSE. 这就是您看到输出的原因。

如果你知道为什么就容易了,对吧?一切都那么合乎逻辑。

你想要测试的$_SERVER['QUERY_STRING']不仅仅是TRUE

switch (TRUE)
{
    case isset($_GET['test0']) :
    ...
}
于 2013-04-29T18:58:10.093 回答
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>";
    }
于 2013-04-29T18:14:03.200 回答
0

关于什么

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

if(!$found){
    echo "no test";
}
于 2013-04-29T17:58:56.910 回答