I函数的作用是获取系统变量,必要时还可以对变量值进行过滤及强制转换
I(‘变量类型.变量名/修饰符’,[‘默认值’],[‘过滤方法或正则’],[‘额外数据源’])
在php中获取变量值得方法很多,
G
E
T
[
′
变
量
名
′
]
,
_GET['变量名'],
GET[′变量名′],_POST[‘变量名’],
S
E
S
S
I
O
N
[
′
变
量
名
′
]
,
_SESSION['变量名'],
SESSION[′变量名′],_COOKIE[‘变量名’],$_SERVER[‘变量名’] 都可以获取相应的变量值,但在thinkphp中为了安全的原因建议统一使用 I 函数来获取变量值。
例如:获取 URL 地址栏中参数 id 的值,在php中我们用 $_GET[‘id’] 来获取,在thinkphp中我们可以用 I(‘get.id’) 来获取。同样的, $_POST[‘id’] 就用 I(‘post.id’) 取代,I 函数的语法格式中的变量类型就是指的像 get 和 post 之类的请求方式,类似的变量类型还包括:
如果要获取的变量类型是get、post 或 put,可以统一用 param 变量类型,param 变量类型是框架特有的支持自动判断当前请求类型的变量获取方式,例如:I(‘param.id’) ,如果当前请求类型是GET,那么等效于 $_GET[‘id’],如果当前请求类型是POST或者PUT,那么相当于获取 $_POST[‘id’] 或者 PUT参数id。而事实上当 I 函数获取的变量类型是param时变量类型可以省略直接写为:I(‘变量名’) ,那么
G
E
T
[
′
i
d
′
]
、
_GET['id']、
GET[′id′]、_POST[‘id’] 都可以简写为:I(‘id’) 。但当变量类型为其他类型时就不能这么简写,比如 I(‘cookie.id’)、I(‘session.id’)就不能简写。
I 函数的变量类型不区分大小写,但变量名严格区分大小写,比如 I(‘get.id’) 可以写成 I(‘GET.id’),但不能写成 I(‘get.ID’)
二、变量过滤
I函数本身默认过滤机制是htmlspecialchars,因为在配置文件中配置了:
// 系统默认的变量过滤机制
‘DEFAULT_FILTER’ => ‘htmlspecialchars’
所以 I(‘post.变量名’) 就等同于 htmlspecialchars($_POST(‘变量名’)),如果 I 函数自身带了过滤方法,则用自身带的过滤机制过滤变量,比如:
I(‘post.email’,‘请输入正确的email地址’,FILTER_VALIDATE_EMAIL);
三、变量修饰符
$page = I(‘param.page’,1);
$limit = I(‘param.limit’,15);
还有一种方式
p
a
g
e
=
I
(
′
p
a
g
e
′
,
1
)
−
1
;
−
>
l
i
m
i
t
(
page=I('page',1)-1; ->limit(
page=I(′page′,1)−1;−>limit(pageSize * $page ,
p
a
g
e
S
i
z
e
)
如
果
前
台
要
限
制
30
,
50
条
之
类
的
,
那
么
就
要
传
一
个
l
i
m
i
t
了
,
那
么
就
要
−
>
l
i
m
i
t
(
pageSize) 如果前台要限制30 ,50条之类的,那么就要传一个limit了,那么就要 ->limit(
pageSize)如果前台要限制30,50条之类的,那么就要传一个limit了,那么就要−>limit(this->pageSize * $page , $limit)
如果是默认值得话,就这么写
//订单号
$orderId = I(‘param.order_id’, ‘’);
//问题类别 问题类别:1识别错误,2数量错误,3其他
$question_type = I(‘param.question_type’, 0);
传入时间的两种写法
第一种
if (!empty($start_time)){
$end_time=$end_time."23:59:59";
$whereStr.=" a.add_time > '{$start_time}' and a.add_time < '{$end_time}' and";
}
第二种
if(!empty(I('start_date')) || !empty(I('end_date'))){
$end_time = I('end_date') . " 23:59:59";
$orderCondtion['add_time'] = array(array('EGT', I('start_date') . ' 00:00:00'), array('ELT', $end_time));
}
如果是字符串拼接的话,会涉及到一个and问题
那么就要过滤一下了
w
h
e
r
e
S
t
r
=
r
t
r
i
m
(
whereStr=rtrim(
whereStr=rtrim(whereStr, ’ and’);
忘了 一点,