1 /**
2 * 获取输入参数 支持过滤和默认值
3 * 使用方法:
4 * <code>
5 * I('id',0); 获取id参数 自动判断get或者post
6 * I('post.name','','htmlspecialchars'); 获取$_POST['name']
7 * I('get.'); 获取$_GET
8 * </code>
9 * @param string $name 变量的名称 支持指定类型
10 * @param mixed $default 不存在的时候默认值
11 * @param mixed $filter 参数过滤方法
12 * @param mixed $datas 要获取的额外数据源
13 * @return mixed
14 */
15 function I($name,$default='',$filter=null,$datas=null) {
16 if(strpos($name,'/')){ // 指定修饰符
17 list($name,$type) = explode('/',$name,2);
18 }elseif(C('VAR_AUTO_STRING')){ // 默认强制转换为字符串
19 $type = 's';
20 }
21 if(strpos($name,'.')) { // 指定参数来源
22 list($method,$name) = explode('.',$name,2);
23 }else{ // 默认为自动判断
24 $method = 'param';
25 }
26 switch(strtolower($method)) {
27 case 'get' : $input =& $_GET;break;
28 case 'post' : $input =& $_POST;break;
29 case 'put' : parse_str(file_get_contents('php://input'), $input);break;
30 case 'param' :
31 switch($_SERVER['REQUEST_METHOD']) {
32 case 'POST':
33 $input = $_POST;
34 break;
35 case 'PUT':
36 parse_str(file_get_contents('php://input'), $input);
37 break;
38 default:
39 $input = $_GET;
40 }
41 break;
42 case 'path' :
43 $input = array();
44 if(!empty($_SERVER['PATH_INFO'])){
45 $depr = C('URL_PATHINFO_DEPR');
46 $input = explode($depr,trim($_SERVER['PATH_INFO'],$depr));
47 }
48 break;
49 case 'request' : $input =& $_REQUEST; break;
50 case 'session' : $input =& $_SESSION; break;
51 case 'cookie' : $input =& $_COOKIE; break;
52 case 'server' : $input =& $_SERVER; break;
53 case 'globals' : $input =& $GLOBALS; break;
54 case 'data' : $input =& $datas; break;
55 default:
56 return NULL;
57 }
58 if(''==$name) { // 获取全部变量
59 $data = $input;
60 $filters = isset($filter)?$filter:C('DEFAULT_FILTER');
61 if($filters) {
62 if(is_string($filters)){
63 $filters = explode(',',$filters);
64 }
65 foreach($filters as $filter){
66 $data = array_map_recursive($filter,$data); // 参数过滤
67 }
68 }
69 }elseif(isset($input[$name])) { // 取值操作
70 $data = $input[$name];
71 $filters = isset($filter)?$filter:C('DEFAULT_FILTER');
72 if($filters) {
73 if(is_string($filters)){
74 $filters = explode(',',$filters);
75 }elseif(is_int($filters)){
76 $filters = array($filters);
77 }
78
79 foreach($filters as $filter){
80 if(function_exists($filter)) {
81 $data = is_array($data) ? array_map_recursive($filter,$data) : $filter($data); // 参数过滤
82 }elseif(0===strpos($filter,'/')){
83 // 支持正则验证
84 if(1 !== preg_match($filter,(string)$data)){
85 return isset($default) ? $default : NULL;
86 }
87 }else{
88 $data = filter_var($data,is_int($filter) ? $filter : filter_id($filter));
89 if(false === $data) {
90 return isset($default) ? $default : NULL;
91 }
92 }
93 }
94 }
95 if(!empty($type)){
96 switch(strtolower($type)){
97 case 'a': // 数组
98 $data = (array)$data;
99 break;
100 case 'd': // 数字
101 $data = (int)$data;
102 break;
103 case 'f': // 浮点
104 $data = (float)$data;
105 break;
106 case 'b': // 布尔
107 $data = (boolean)$data;
108 break;
109 case 's': // 字符串
110 default:
111 $data = (string)$data;
112 }
113 }
114 }else{ // 变量默认值
115 $data = isset($default)?$default:NULL;
116 }
117 is_array($data) && array_walk_recursive($data,'think_filter');
118 return $data;
119 }