具有括号不在codeigniter中使用datamapper ORM的URL

时间:2013-01-22 19:06:03

标签: url codeigniter-2 codeigniter-datamapper

我正在使用带有datamapper ORM的codeigniter,今天我发现了一个奇怪的错误。

我有一个名为categories的函数,它从item页面链接。 url to category使用类别名称形成,并使用rawurlencode进行编码。

在类别方法中,我解码此url字符串并使用get_by_name查找类别。这种方法很有效,除非类别名称包含括号

假设我有一个项目“ABCDEFGHI”属于“Alphabets(英文)”类别。现在运行rawurlencode后的类别给出字符串“Alphabets%20%28English%29”,当我运行rawurkdecode时,再次成为“Alphabets(英语)”,如预期的那样。

<?php
$a = "Alphabets (English)";
$b = rawurlencode("Alphabets (English)");
$c = rawurldecode($b);
echo ($a == $c); //returns 1
?>

所以我知道$ a和$ c是相等的。我甚至测试了下面给出的方法,通过替换确切的字符串值“Alphabets(English)”,它可以工作但是使用rawurldecode不会。

但是仍然以下方法返回nil 404页面。

function categories($url = '',$page = 1){
    $url = rawurldecode($url);
  //echo $url;
  //I tried echo here and it gives "Alphabets (English)"
    $cat = new Category();
    $cat->get_by_name($url);
  // replacing $url with the string output from echo $url 
  //in above call works. what is happening here?
  // $cat->get_by_name("Alphabets (English)"); works but 
  // $cat->get-by_name($url); doesn't
    if(empty($cat->id)){
        show_404();
    }
    else{
      // work to do//
    }
}

我知道我不应该使用这种方法,我应该标题类别的名称并在表格中有一个额外的字段。但我现在不想要打破链接。

我希望你能理解我的问题。请给我一些线索。帮我弄清楚这个问题。

谢谢!

被修改

我阅读了rawurlencode手册,有人在本页http://php.net/manual/pt_BR/function.rawurlencode.php

上说

另请注意,某些字符当前是“保留”但应该被视为“不安全”:这包括括号“()”,当在MIME标头中使用URL时,它们显然是不安全的。

因此,如果有效的URL包含“()”字符,则应使用上层编码将URL与上层协议中定义的一对“不安全”字符包围在一起(例如MIME标头中的“&lt;&gt;”对,因为这些字符不能是有效网址的一部分)...

我相信codeigniter或datamapper或两者都不允许使用这些括号字符。如果你找到一些解决方案,请帮助。 我尝试在codeigniter配置中添加括号到允许的uri字符,但仍然没有运气。

1 个答案:

答案 0 :(得分:0)

if(empty($genre->id))

什么是$ genre,你忘记将$ cat-&gt; get_by_name($ url)的回报设置为$ genre?