用户
 找回密码
 入住 CI 中国社区
搜索
查看: 13310|回复: 10
收起左侧

[初级] 让CI支持中文传参的更简易的三种方法

[复制链接]
发表于 2010-4-13 17:54:49 | 显示全部楼层 |阅读模式
本帖最后由 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类中解密了一次。~~

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

发表于 2010-4-19 15:20:30 | 显示全部楼层
额是菜鸟 为什么直接在library里放入这个文件就可以?它怎么调用的啊???
发表于 2010-4-19 16:48:39 | 显示全部楼层
额是菜鸟 为什么直接在library里放入这个文件就可以?它怎么调用的啊??? ...
libintc123 发表于 2010-4-19 15:20



    这个你就要看 CI 源码了,CI 是有一个机制自动调用的。
发表于 2010-4-26 06:44:06 | 显示全部楼层
额是另一头菜鸟……额一直是酱紫用的。不需要加文件。
因为我的uri参数是一段,自己处理。参见 31103.cn

config/config.php
PHP复制代码
 
//$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
$config['permitted_uri_chars'] = '';
 
复制代码
 楼主| 发表于 2010-4-26 15:53:55 | 显示全部楼层
回复 4# bigfat


    你这样做是比较危险的,CI就不会对参数进行过滤了。
发表于 2010-7-3 13:27:39 | 显示全部楼层
谢了哦 解决我大问题了 狂顶
发表于 2010-8-3 17:03:43 | 显示全部楼层
本帖最后由 dllhb 于 2010-8-3 17:05 编辑

我使用你的方法为什么传入‘大连’显示:澶ц繛,我的网页头:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN "
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="utf-8">
发表于 2010-8-3 17:14:04 | 显示全部楼层
未命名.GIF
 楼主| 发表于 2010-8-4 09:38:13 | 显示全部楼层
回复 8# dllhb


    编码问题
发表于 2011-3-16 21:59:17 | 显示全部楼层
本帖最后由 feiying0193 于 2011-3-16 22:02 编辑

把中文先编码再传,接收后再解码不行吗?

PHP复制代码
 
//编码
 
$string = base64_encode('小明');
anchor('welcome/index/'.$string,'链接');
 
 
//welcome.php
function index($string){
    echo base64_decode($string);//解码
}
 
 
复制代码

本版积分规则