im试图用列表爆炸对类别和子类别进行排序,但得到了
未定义偏移:1
这是代码的一部分
$squery = $_SERVER['QUERY_STRING'];
$smarty->assign('query', $squery);
list($str, $trash) = explode('&', $squery, 2);
list($category, $subcategory) = explode('=', $str, 2);
switch($category)
{
case 'locale':
$_SESSION['locale'] = $subcategory;
checklocale();
header('Location:'.($_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : '.'));
break;
default:
include 'main.php';
break;
}
你能告诉我我做错了什么吗
您的查询字符串中似乎没有&
,因此您的爆炸返回一个带有单个项的数组,导致list()
抛出通知。
你可能想:
- 验证
$_SERVER['QUERY_STRING']
中是否确实存在值 - 考虑使用类似
parse_str()
的东西来解析字符串中的变量 - 分别验证查询字符串中是否存在值
您还可以考虑使用$_GET
而不是$_SERVER['QUERY_STRING']
来更直接地访问参数。如果参数以错误的顺序传递,那么您当前的方法很容易中断。
你能告诉我做错了什么吗
我知道,大多数时候,当您试图在数组中定义未索引的字符时,会出现Undefined offset:
错误。例如,$var="foo";现在,如果你使用echo $var[3];
,你会得到同样的错误,因为,当3是"foo"的偏移量时;其只有三个字符,即从CCD_ 9到CCD_;
事实上,你给出的代码有限,我怀疑问题出在explode('&', $squery, 2);
的某个地方
您可以通过仅检查locale是否在QUERY_STRING上设置
像
if(isset($_GET['locale'])){
$_SESSION['locale'] = $subcategory;
checklocale();
header('Location:'.($_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : '.'));
}else{
include 'main.php';
}