关于U函数生成错误的bug(parse_url)

浏览:990 发布日期:2010/09/01
- 普通 - 未处理
原来一直用FLEA, 昨天刚开始学习用TP便遇到了一个U函数的问题。

我的项目目录是statistic_new
当使用默认项目设置,并使用U函数生成URL时,
例如U("module/action"),会生成一个这样的一个url: /statistic_new/index.php/项目名称/module/action
这显然是不对的,按理来说应该是:/statistic_new/index.php/module/action

于是在论坛发贴,也看到一位仁兄碰到一个相同的问题。
无果后还是决定自己看源码了。

最后只能自己分析源代码了,我们来看一下TP的U函数:function U($url,$params=array(),$redirect=false,$suffix=true) {
    if(0===strpos($url,'/'))
        $url = substr($url,1);
    if(!strpos($url,'://')) // 没有指定项目名 使用当前项目名
        $url = APP_NAME.'://'.$url;
    if(stripos($url,'@?')) { // 给路由传递参数
        $url = str_replace('@?','@think?',$url);
    }elseif(stripos($url,'@')) { // 没有参数的路由
        $url = $url.MODULE_NAME;
    }

    // 分析URL地址
    $array   =  parse_url($url);
    ...

    if($redirect)
        redirect($url);
    else
        return $url;
}
我们看这一句:
if(!strpos($url,'://')) // 没有指定项目名 使用当前项目名
$url = APP_NAME.'://'.$url;
还有这一句:默认把我的项目名称statistic_new作为APP_NAME加上了
于是变成了statistic_new://module/action
再看下面有一句 $array = parse_url($url);
关键就在这里,我不明白为什么TP要用这个函数来解析URL,或许是为了图省事儿吧,这个地方会有一个bug,就是当scheme字符串带有下划线时就会解析不成功,也就是说statistic_new不能带有下划线,
解析结果如下:
array(2) {
["host"]=>
string(13) "statistic_new"
["path"]=>
string(15) "//module/action"
}
如果把statistic_new改为statistic时解析结果为:
array(3) {
["scheme"]=>
string(9) "statistic"
["host"]=>
string(6) "module"
["path"]=>
string(7) "/action"
}
而数组里的host其实就是TP的module,path就是TP的action
解析错误也就意味着,如果您的项目目录名有下划线等特殊字符,就会造成解析不成功,导致U函数出错。

但是,对于采用默认项目设置的用户来说,如果想省事儿,并避开这个问题,可以在入口文件中重新定义APP_NAME
define("APP_NAME","Home");
问题便可以得以解决。

按照官方文档上的说法如下:
如果你的项目入口文件放到项目目录下面的话,可以无需定义APP_NAME和APP_PATH,系统可以自动识别。THINK_PATH通常也不是必须的。

或者官方可以把解析代码稍作修改,我就不贴上修改的详细代码了。

希望能对遇到此类问题的朋友有些许帮助。
评论(
后面还有条评论,点击查看>>