Blogger Information
Blog 30
fans 0
comment 1
visits 24077
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0113,服务器常用变量$_SERVER,过滤器基础与序列化操作
Original
1135 people have browsed it

WEB服务器变量

$_SERVER
它是一个包含诸如头部(header)、路径(path)、执行脚本文件(PHP_SELF)等当前服务器信息的数组。
通过PHP命令可以输出当前服务器信息进行查看

  1. <?php
  2. // 输出当前服务器具体数据
  3. echo '<pre>'.print_r($_SERVER,true).'</pre>';

可以看出输出的数据是一个二维数组

WBE服务器常用变量

1.SERVER_NAME

  1. <?php
  2. // 访问一个二维数组,直接在[]里面添加键名就行。
  3. // 获取并输出当前服务器主机名
  4. echo $_SERVER['SERVER_NAME'];



2.PHP_SELF

  1. <?PHP
  2. // 获取并输出当前PHP执行脚本(文件)的路径以及名称
  3. echo $_SERVER['PHP_SELF'];



3.REQUEST_METHOD

  1. <?PHP
  2. // 获取并输出当前发送数据请求的方式,因为没设置,默认就是GET方法
  3. echo $_SERVER['REQUEST_METHOD'];



4.QUERY_STRING

  1. <?PHP
  2. // 获取并输出当前地址栏上的查询字符串。
  3. echo $_SERVER['QUERY_STRING'];



5.SERVER_PORT
端口 80,是HTTP://协议, 端口443,是HTTPS://协议

  1. <?php
  2. // 获取并输出当前服务器开放的端口
  3. echo $_SERVER['SERVER_PORT'];



6.SERVER_URI

  1. <?php
  2. // 获取并输出当前PHP执行脚本(文件)的路径以及名称
  3. echo 'PHP_SELF输出为:'.$_SERVER['PHP_SELF'];
  4. echo '<HR>';
  5. // 获取并输出当前地址栏除主机名外的所有字符串
  6. echo 'REQUEST_URI输出为:'.$_SERVER['REQUEST_URI'];



7.HTTP_HOST

  1. <?php
  2. // 获取并输出当前服务器主机名
  3. echo 'SERVER_NAME输出为:'.$_SERVER['SERVER_NAME'];
  4. // 它的输出虽然和SERVER_NAME类似,但是它更安全可靠
  5. echo 'HTTP_HOST输出为:'.$_SERVER['HTTP_HOST'];



8.SCRIPT_FILENAME

  1. <?php
  2. // 获取并输出当前脚本(PHP文件)的绝对路径
  3. echo $_SERVER['SCRIPT_FILENAME'];



以上是关于服务器常用的变量

过滤器(常用)

1.filter_has_var:检测是否存在指定类型的变量,成功返回true,失败返回false
格式:filter_has_var(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。

  1. <?php
  2. // 使用过滤器检查$_GET['id']是否存在
  3. // INPUT_GET,'id',等价于$_GET['id']
  4. echo filter_has_var(INPUT_GET,'id') ? '存在ID' : '不存在';



2.filter_input:通过指定的数组变量获取其值,成功返回所请求的变量值,如果不存在,返回null
格式:filter_input(数组变量,’键名’)
数组变量包括 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER,INPUT_ENV里面的其中一个。
键名就是以上数组里面包含的需要过滤的键名即可。

  1. <?php
  2. // 检查ID,不存在,用gettype查看类型,可以发现为NULL
  3. echo 'ID值为:'.gettype(filter_input(INPUT_GET,'id'));



3.filter_var:调用用户定义的变量
格式:filter_var(用户自定义变量,过滤器参数)

  1. <?php
  2. $email = 'admin@qq.com';
  3. // filter_var,主要是过滤检测用户自定义的变量
  4. echo 'email返回值为:'.filter_var($email,FILTER_VALIDATE_EMAIL);


添加过滤参数(常用)

FILTER_VALIDATE_EMAIL:把值作为EMAIL格式验证

  1. <?php
  2. // FILTER_VALIDATE_EMAIL表示为把需要过滤的数值用EMAIL格式进行验证
  3. // 验证成功,输出该值,失败返回false
  4. echo '邮箱验证正确输出为:'.filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL);



FILTER_SANITIZE_URL:过滤掉(删除)字符串中所有非法的URL字符

  1. <?php
  2. // 首先创建一个关于URL(链接)的字符串
  3. $url = 'https://www.baidu.co、m';
  4. // 输出该字符串原始样子
  5. echo $url.'<hr>';
  6. // 过滤掉字符串里面非法的URL字符
  7. echo filter_var($url,FILTER_SANITIZE_URL);



FILTER_VALIDATE_INT:检测变量的值是否为整数

  1. <?php
  2. $num = 11.5;
  3. echo filter_var($url,FILTER_VALIDATE_INT) ? 'num的值为:' : 'num的值不为整数';



FILTER_SANITIZE_NUMBER_INT:把字符串转换为数值型,并删除字符串中非法的数值型字符(允许保留’+’、’-‘)

  1. <?php
  2. $num = '11.5+5+6@5';
  3. echo '原始值为:'.$num;
  4. echo '<hr>';
  5. echo filter_var($num,FILTER_SANITIZE_NUMBER_INT);


结合上面的函数,做一个简单的数据判断与页面访问的合法性

数据判断

  1. <?php
  2. //首先检测$_POST里面有没有email
  3. //filter_has_var,返回值为布尔值
  4. if(filter_has_var(INPUT_POST,'email')){
  5. //如果email有值,则检测它的值是否符合email格式
  6. //filter_input,返回值为email的值
  7. if(filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){
  8. //格式正确输出
  9. echo '邮箱正确';
  10. }else{
  11. //格式错误则输出
  12. echo '邮箱格式错误';
  13. }
  14. }else{
  15. //如果没检测到直接输出此条信息
  16. echo '没有检测到电子邮箱';
  17. }



页面访问合法性
1.$_SERVERL里的’HTTP_REFERER’

  1. <?php
  2. // HTTP_REFERER 返回值为页面跳转前的链接/路径(页面来源链接/路径)
  3. echo '跳转过来的页面链接为:'.filter_input(INPUT_SERVER,'HTTP_REFERER');



2.dirname(),参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。

  1. <?php
  2. echo '跳转过来的页面链接为'.filter_input(INPUT_SERVER,'HTTP_REFERER');
  3. echo '<hr>';
  4. // dirname() 参数是一个包含有指向一个文件的全路径的字符串。该函数返回去掉文件名后的目录名。
  5. echo '输出为跳转过来的页面链接去掉文件名后的目录名:'.dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));



3.in_array()搜索数组中是否存在指定的值。

  1. <?php
  2. //创建一个数组
  3. $arr = ['a','b','c','d'];
  4. //创建一个变量,值与数组里有一个相同
  5. $value = 'b';
  6. if(in_array($value,$arr)){
  7. echo '在数组$arr中查询到与$value相同的值';
  8. }else{
  9. echo '未查询到相同的值';
  10. }



4.根据上面3个例子,组合起来,就可以写出一个只允许某些链接访问的页面

  1. <?php
  2. // 获取到跳转过来的页面地址
  3. $url = filter_input(INPUT_SERVER,'HTTP_REFERER');
  4. // 通过获取跳转页面的地址,来获取到除文件名外的其他链接信息
  5. $rusdir = dirname(filter_input(INPUT_SERVER,'HTTP_REFERER'));
  6. // 创建一个包含允许链接的数组
  7. $urls = [
  8. // 把获取到的链接目录,拼接上允许访问的文件名即可
  9. $rusdir.'/admin.php',
  10. $rusdir.'/reg.php',
  11. $rusdir.'/about.php',
  12. ];
  13. // 我是分割线
  14. echo '<hr>';
  15. // 使用in_array()函数查询当前跳转页面的链接是否合法(是否与事先创建的允许链接相同)
  16. if(in_array($url,$urls)){
  17. echo '链接来源合法';
  18. }else{
  19. echo '非法链接';
  20. }

图1

图2

1.序列化函数serialize(),参数为数组,返回值为字符串,但是它会保留序列化以前的类型与结构

  1. <?php
  2. // 序列化
  3. // 创建一个数组
  4. $arr = [50,'abc','123',9];
  5. // 序列化它并赋值给前面的变量
  6. $item = serialize($arr);
  7. echo $item;



2.反序列化unserialize()参数为序列化后的值,返回值为数组

  1. <?php
  2. $a1 = unserialize('a:4:{i:0;i:50;i:1;s:3:"abc";i:2;s:3:"123";i:3;i:9;}');
  3. echo '$a1的类型为:'.gettype($a1).'<hr>';
  4. echo '$a1的值为:<pre>'.print_r($a1,true).'</pre>';


又完成一节课程了,这节课在最开始看的时候,感觉很迷茫,特别是过滤器与服务器变量,第一遍看的时候一脸懵逼。然后在看第二遍的时候,一遍观看,一遍对照PHP手册,终于看懂了,但是如果不多练习,感觉过几天又得搞忘- -,所以这次写的比较细,就是怕忘记了,回看笔记的时候又看不懂,那就太难了(=。=###)。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:服务器变量尽管很多, 常用的并不多, 并且不少都有对应的函数来获取
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post