0

我正在将 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 字符添加括号,但仍然没有运气。

4

1 回答 1

0
if(empty($genre->id))

$genre 是什么,你忘了设置 $cat->get_by_name($url) 的返回值为 $genre 吗?

于 2013-01-22T19:24:21.647 回答