使用列表分解时未定义的偏移量


undefined offset when using list explode

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