我正在将 codeigniter 与 datamapper ORM 一起使用,今天我注意到一个奇怪的错误。
我有一个名为 categories 的函数,它从项目页面链接。到类别的 url 使用类别的名称形成,并使用 rawurlencode 进行编码。
在类别方法中,我解码此 url 字符串并使用 get_by_name 找到类别。这很好用,除非类别名称包含括号
假设我有一个属于“字母(英语)”类别的项目“ABCDEFGHI”。现在,运行 rawurlencode 后的类别给出字符串“Alphabets%20%28English%29”,当我运行 rawurkdecode 时,它再次按预期变为“Alphabets (English)”。
<?php
$a = "Alphabets (English)";
$b = rawurlencode("Alphabets (English)");
$c = rawurldecode($b);
echo ($a == $c); //returns 1
?>
所以我知道 $a 和 $c 是相等的。我什至通过替换确切的字符串值说“字母(英语)”来测试下面给出的方法,它可以工作,但使用 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 标头中配对,因为这些字符不能成为有效 URL 的一部分)...
我相信 codeigniter 或 datamapper 或两者都不允许这些括号字符。如果您找到了一些解决方案,请提供帮助。我尝试在 codeigniter 配置中为允许的 uri 字符添加括号,但仍然没有运气。