|
本帖最后由 longjianghu 于 2010-4-14 11:14 编辑
在项目应用中有时会用到中文参数,CI会进行安全性过滤,所以通常比较麻烦,论坛上有一个解决方法,改的地方还是比较多,地址是:http://codeigniter.org.cn/forums/viewthread.php?tid=1382,如果我只是临时用一下,改这么多内容比较麻烦。
比如下面的示例:
http://www.domain.com/index.php/app/show/小王,在这里我想将小王以参数传到show方法里面处理。通常情况下我们会向下面这样写:
PHP复制代码 $this->load->helper('url');
echo anchor('app/show/小王','链接'); 复制代码
由于CI安全性过滤的原因,中文肯定通不过验证直接提示:
The URI you submitted has disallowed characters。
下面我自己写了一个扩展,你可以直接把下面的代码另存为MY_URI.php存放到你项目中的libraries目录下。代码如下:
PHP复制代码 <?php
class MY_URI extends CI_URI {
function _explode_segments ()
{
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
{
// Filter segments for security
$val = trim($this->_filter_uri (rawurlencode($val))); if ($val != '')
{
$this->segments[] = rawurldecode($val);
}
}
}
}
?> 复制代码
当CI获取参数的时候我使用rawurlencode加密我们传过去的中文参数,_filter_uri用正则过滤,明显我们传过去是参数是有效的,下面给$this->segments数组赋值的时候我在用rawurldecode解密,这样我就可以直接使用了。
也许有人会问为什么不使用urlencode,这里我要告诉你的是,urlencode也可以使用,但是如果中文参数有空格,该函数会把空格编码成加号,但加号就通不过_filter_uri函数的验证了(config.php文件里$config['permitted_uri_chars'] 中不允许加号)。
个人觉得我这个方法比上面提到的方法简便一点,不用更改哪么多设置,如有错误欢迎指正!
如果你是临时用一下你可以直接使用rawurlencode,不过我发现要写两次。比如这样:rawurlencode(rawurlencode('你的参数'));至于为什么要写两次我还正在研究,当然解密的时候也需要解两次。如果你使用smarty传参,你可以使用smarty的escape方法,像这样:{$user.user_name|escape:"url"|escape:"url"}。
这样就可以顺利传参了,为什么要写两次,哪里因为CI在input类中解密了一次。~~ |
评分
-
查看全部评分
|