PHP switch case语句中的默认case;它并不是真正的默认值


default case in a PHP switch-case statement doesn't really work as the default?

我在一个页面上使用以下PHP代码,用户在提交了一个包含特定foo输入名称的表单后会访问该页面,该PHP代码会处理该表单,并相应地决定将用户转发到哪个URL。

我刚刚注意到,如果用户没有使用foo输入名称输入该页面(例如,由于某些错误,假设上一页上的表单的输入名称为"vvv"),则此PHP代码不会将用户发送到默认URL。相反,它会在一个循环中每3秒刷新一次自己。

为什么?是否应该在出现任何错误的情况下获得默认值,包括上述情况?

代码:

<?php
if(isset($_POST['foo'])){
    switch ($_POST['foo']) {
    case "aaa":
        $url = "http://www.aaa.com/";
        break;
    default:
        $url = "http://www.bbb.com/";
    }
}
header( "refresh:3;url=$url" );

?>  
<!doctype html>
<html>
<head>
<style>
.test {display: block;}
</style>
</head>
<body>
test
</body>
</html>

1)我认为您在扰乱$_POST$_GETGet参数在URL中可见,POST不在URL中显示。

2) 若并没有$_POST['foo'],则会抛出错误,因为并没有设置$url变量。更好地更改此代码:

if(isset($_GET['foo'])){
    switch ($_GET['foo']) {
        case "aaa":
            $url = "http://www.aaa.com/?foo=bbb";
            header( "refresh:3;url={$url}" );
            break;
        default:
            $url = "http://www.bbb.com/?foo=aaa";
            header( "refresh:3;url={$url}" );
    }
    die(); // Optionally, if you wish not to continue any script
} else {
    /* Show default code */
}

请验证在没有foo参数的情况下导航到此页面时是否已到达switch狙击手。

在您的情况下,$url尚未启动(可能是if条件失败)。因此,header函数将实际向浏览器发送此标头:refresh:3;url=url=之后的空字符串),这将导致浏览器每3秒刷新一次当前url。

<?php
$url = "http://www.bbb.com/"; 
if(isset($_POST['foo'])){
    switch ($_POST['foo']) {
    case "aaa":
        $url = "http://www.aaa.com/";
        break;
    }
}
header( "refresh:3;url=$url" );

?>  
<!doctype html>
<html>
<head>
<style>
.test {display: block;}
</style>
</head>
<body>
test
</body>
</html>

如果你在顶部设置默认url会更好。因此,即使没有一个案例得到匹配。默认值将始终存在。如果case中的值匹配,则它将被替换。

$_POST['foo']有任何值吗?尝试转储该值以检查其中是否有任何内容:

var_dump($_POST['foo'])

如果结果为空,则您的表单中存在错误。

像这样的东西应该起作用:

<form method='post' action = $this->url()>
  <div>
    <input type='text' name='foo' value='foo'>
  </div>
  <div>
    <input type='submit' value='submit' name='submit'>
  </div>
</form>

行动:

if(isset($_POST['foo']) && !empty($_POST['foo'])){
    switch ($_POST['foo']) {
    case "aaa":
        $url = "http://www.aaa.com/";
        break;
    default:
        $url = "http://www.bbb.com/";
    }
}