使用列表爆炸时未定义的偏移量

时间:2013-02-11 18:15:23

标签: php list smarty explode

我试图用列表爆炸对类别和子类别进行排序,但是获取

  

未定义的偏移: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;
    }

你能告诉我我做错了吗

3 个答案:

答案 0 :(得分:2)

好像您的查询字符串中没有&,因此您的爆炸返回一个包含单个项目的数组,导致list()抛出通知。

你可能想:

  • 确认$_SERVER['QUERY_STRING']
  • 中确实存在值
  • 考虑使用parse_str()之类的东西来解析字符串
  • 中的变量
  • 单独验证查询字符串中是否存在值

您还可以考虑使用$_GET代替$_SERVER['QUERY_STRING']来替代更直接地访问参数。如果参数以错误的顺序传递,您当前的方法很容易中断。

答案 1 :(得分:0)

  

你能告诉我我做错了吗

好吧,大多数时候我都知道,当你试图在数组中定义一个未索引的字符时会出现Undefined offset:错误。例如,$ var =“foo”;现在,如果你要echo $var[3];,你会得到同样的错误,因为,当3是“foo”的偏移时;只有三个字符,即从02;

事实上,你提供了有限的代码,我怀疑问题是某个地方explode('&', $squery, 2);

答案 2 :(得分:0)

你可以做到这一点只检查区域设置是否在QUERY_STRING上设置

喜欢

if(isset($_GET['locale'])){
         $_SESSION['locale'] = $subcategory;
        checklocale();
        header('Location:'.($_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : '.'));

}else{

     include 'main.php';
}