我正在使用带有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字符,但仍然没有运气。
答案 0 :(得分:0)
if(empty($genre->id))
什么是$ genre,你忘记将$ cat-&gt; get_by_name($ url)的回报设置为$ genre?