WEB服务器变量
$_SERVER
它是一个包含诸如头部(header)、路径(path)、执行脚本文件(PHP_SELF)等当前服务器信息的数组。
通过PHP命令可以输出当前服务器信息进行查看
<?php
// 输出当前服务器具体数据
echo '<pre>'.print_r($_SERVER,true).'</pre>';
可以看出输出的数据是一个二维数组
WBE服务器常用变量
1.SERVER_NAME
<?php
// 访问一个二维数组,直接在[]里面添加键名就行。
// 获取并输出当前服务器主机名
echo $_SERVER['SERVER_NAME'];
图
2.PHP_SELF
<?PHP
// 获取并输出当前PHP执行脚本(文件)的路径以及名称
echo $_SERVER['PHP_SELF'];
图
3.REQUEST_METHOD
<?PHP
// 获取并输出当前发送数据请求的方式,因为没设置,默认就是GET方法
echo $_SERVER['REQUEST_METHOD'];
图
4.QUERY_STRING
<?PHP
// 获取并输出当前地址栏上的查询字符串。
echo $_SERVER['QUERY_STRING'];
图
5.SERVER_PORT
端口 80,是HTTP://协议, 端口443,是HTTPS://协议
<?php
// 获取并输出当前服务器开放的端口
echo $_SERVER['SERVER_PORT'];
图
6.SERVER_URI
<?php
// 获取并输出当前PHP执行脚本(文件)的路径以及名称
echo 'PHP_SELF输出为:'.$_SERVER['PHP_SELF'];
echo '<HR>';
// 获取并输出当前地址栏除主机名外的所有字符串
echo 'REQUEST_URI输出为:'.$_SERVER['REQUEST_URI'];
图
7.HTTP_HOST
<?php
// 获取并输出当前服务器主机名
echo 'SERVER_NAME输出为:'.$_SERVER['SERVER_NAME'];
// 它的输出虽然和SERVER_NAME类似,但是它更安全可靠
echo 'HTTP_HOST输出为:'.$_SERVER['HTTP_HOST'];
图
8.SCRIPT_FILENAME
<?php
// 获取并输出当前脚本(PHP文件)的绝对路径
echo $_SERVER['SCRIPT_FILENAME'];
图
以上是关于服务器常用的变量
过滤器(常用)
1.filter_has_var:检测是否存在指定类型的变量,成功返回true,失败返回false
格式:filter_has_var(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。
例
<?php
// 使用过滤器检查$_GET['id']是否存在
// INPUT_GET,'id',等价于$_GET['id']
echo filter_has_var(INPUT_GET,'id') ? '存在ID' : '不存在';
图
2.filter_input:通过指定的数组变量获取其值,成功返回所请求的变量值,如果不存在,返回null
格式:filter_input(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。
例
<?php
// 检查ID,不存在,用gettype查看类型,可以发现为NULL
echo 'ID值为:'.gettype(filter_input(INPUT_GET,'id'));
图
3.filter_var:调用用户定义的变量
格式:filter_var(用户自定义变量,过滤器参数)
例
<?php
$email = 'admin@qq.com';
// filter_var,主要是过滤检测用户自定义的变量
echo 'email返回值为:'.filter_var($email,FILTER_VALIDATE_EMAIL);
图
添加过滤参数(常用)
FILTER_VALIDATE_EMAIL:把值作为EMAIL格式验证
例
<?php
// FILTER_VALIDATE_EMAIL表示为把需要过滤的数值用EMAIL格式进行验证
// 验证成功,输出该值,失败返回false
echo '邮箱验证正确输出为:'.filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);
图
FILTER_SANITIZE_URL:过滤掉(删除)字符串中所有非法的URL字符
例
<?php
// 首先创建一个关于URL(链接)的字符串
$url = 'https://www.baidu.co、m';
// 输出该字符串原始样子
echo $url.'<hr>';
// 过滤掉字符串里面非法的URL字符
echo filter_var($url,FILTER_SANITIZE_URL);
图
FILTER_VALIDATE_INT:检测变量的值是否为整数
例
<?php
$num = 11.5;
echo filter_var($url,FILTER_VALIDATE_INT) ? 'num的值为:' : 'num的值不为整数';
图
FILTER_SANITIZE_NUMBER_INT:把字符串转换为数值型,并删除字符串中非法的数值型字符(允许保留’+’、’-‘)
例
<?php
$num = '11.5+5+6@5';
echo '原始值为:'.$num;
echo '<hr>';
echo filter_var($num,FILTER_SANITIZE_NUMBER_INT);
图
结合上面的函数,做一个简单的数据判断与页面访问的合法性
数据判断
例
<?php
//首先检测$_POST里面有没有email
//filter_has_var,返回值为布尔值
if(filter_has_var(INPUT_POST,'email')){
//如果email有值,则检测它的值是否符合email格式
//filter_input,返回值为email的值
if(filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){
//格式正确输出
echo '邮箱正确';
}else{
//格式错误则输出
echo '邮箱格式错误';
}
}else{
//如果没检测到直接输出此条信息
echo '没有检测到电子邮箱';
}
图
页面访问合法性
1.$_SERVERL里的’HTTP_REFERER’
<?php
// HTTP_REFERER 返回值为页面跳转前的链接/路径(页面来源链接/路径)
echo '跳转过来的页面链接为:'.filter_input(INPUT_SERVER,'HTTP_REFERER');
图
2.dirname(),参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。
<?php
echo '跳转过来的页面链接为'.filter_input(INPUT_SERVER,'HTTP_REFERER');
echo '<hr>';
// dirname() 参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。
echo '输出为跳转过来的页面链接去掉文件名后的目录名:'.dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));
图
3.in_array()搜索数组中是否存在指定的值。
<?php
//创建一个数组
$arr = ['a','b','c','d'];
//创建一个变量,值与数组里有一个相同
$value = 'b';
if(in_array($value,$arr)){
echo '在数组$arr中查询到与$value相同的值';
}else{
echo '未查询到相同的值';
}
图
4.根据上面3个例子,组合起来,就可以写出一个只允许某些链接访问的页面
<?php
// 获取到跳转过来的页面地址
$url = filter_input(INPUT_SERVER,'HTTP_REFERER');
// 通过获取跳转页面的地址,来获取到除文件名外的其他链接信息
$rusdir = dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));
// 创建一个包含允许链接的数组
$urls = [
// 把获取到的链接目录,拼接上允许访问的文件名即可
$rusdir.'/admin.php',
$rusdir.'/reg.php',
$rusdir.'/about.php',
];
// 我是分割线
echo '<hr>';
// 使用in_array()函数查询当前跳转页面的链接是否合法(是否与事先创建的允许链接相同)
if(in_array($url,$urls)){
echo '链接来源合法';
}else{
echo '非法链接';
}
图1
图2
最后预习下cookie要使用到的序列化与反序列化操作
1.序列化函数serialize(),参数为数组,返回值为字符串,但是它会保留序列化以前的类型与结构
例
<?php
// 序列化
// 创建一个数组
$arr = [50,'abc','123',9];
// 序列化它并赋值给前面的变量
$item = serialize($arr);
echo $item;
图
2.反序列化unserialize()参数为序列化后的值,返回值为数组
例
<?php
$a1 = unserialize('a:4:{i:0;i:50;i:1;s:3:"abc";i:2;s:3:"123";i:3;i:9;}');
echo '$a1的类型为:'.gettype($a1).'<hr>';
echo '$a1的值为:<pre>'.print_r($a1,true).'</pre>';
图
又完成一节课程了,这节课在最开始看的时候,感觉很迷茫,特别是过滤器与服务器变量,第一遍看的时候一脸懵逼。然后在看第二遍的时候,一遍观看,一遍对照PHP手册,终于看懂了,但是如果不多练习,感觉过几天又得搞忘- -,所以这次写的比较细,就是怕忘记了,回看笔记的时候又看不懂,那就太难了(=。=###)。