- 让我补充一下。这段代码对我来说就是这样的。我只是不知道它为什么会起作用.--
我无法解决这个问题。
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时,&#34; test0&#34;显示。
当url是index.php?test4时,&#34; test4&#34;显示。
当url是index.php?test999时,&#34;没有测试&#34;显示。
当网址是index.php?tes时,&#34;没有测试&#34;显示。
当url是index.php?或index.php时,&#34; test0&#34;显示。
这是为什么?条件不满足,默认情况下是否应该显示?
答案 0 :(得分: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
被认为是从上到下。在这种情况下,$ _SERVER [“QUERY_STRING”]会自动转换为bool(在这种情况下将返回true)。它看到的第一个案例是test0,所以它回应了。如果你为test0-4这样做,它会给你一个错误的错觉,即这个代码按预期工作,而不考虑边缘情况。
实现目标的唯一方法是使用多个ifs,或重新设计应用程序。
答案 1 :(得分: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']
为FALSE
,则会输出test0
。
由于PHP中的switch { case:}
执行松散比较,因此空字符串$_SERVER['QUERY_STRING']
为FALSE
。这就是你看到输出的原因。
如果你知道为什么容易,对吧?一切都那么合乎逻辑。
您想要测试的不是$_SERVER['QUERY_STRING']
,而只是TRUE
:
switch (TRUE)
{
case isset($_GET['test0']) :
...
}
答案 2 :(得分:0)
怎么样
$found = false;
for($i=0;$i <=4; $i++){
if( isset($_GET['test'.$i]) ){
echo "test".$i;
$found = true;
}
}
if(!$found){
echo "no test";
}
答案 3 :(得分: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>";
}