PHP学习笔记(二)

一、面向对象编程

1.类与对象

1.1.类与对象

  • class 类名 { 成员}
  • $对象名 = new 类名 (参数);

1.2.类的封装

<?php
class Person {
    // 下面是人的成员属性,都是封装的私有成员
    private $name ;       // 人的名字
    private $sex ;        // 人的性别
    private $age ;        // 人的年龄
    //__get() 方法用来获取私有属性
    public function __get( $a ){
        if ( isset( $this -> $a) ) //如果此变量没有被设置
            return $this -> $a;
        else return (NULL);
    }
    //__set() 方法用来设置私有属性
    public function __set($a,$value){
        $this -> $a = $value;
    }
}
$p1 = new Person();
// 直接为私有属性赋值的操作,会自动调用 __set() 方法进行赋值
$p1 ->name= " 张三 " ;
$p1 ->sex= " 男 " ;
$p1 ->age= 20 ;
// 直接获取私有属性的值,会自动调用 __get() 方法,返回成员属性的值
echo " 姓名: " .$p1 ->name;
echo "<hr>";
echo " 性别: " .$p1 ->sex;
echo "<hr>";
echo " 年龄: " .$p1 ->age;
?>

2.构造方法和析构方法

<?php
/*构造方法:
 * 修饰符 function __construct (参数列表) {
 *  //初始化操作
 * }
 *  析构方法:
 * 修饰符 function __destruct (参数列表) {
 *  //清理操作
 * }
 * */
class Person{
    public $name;
    public function __construct($name){//构造方法
        $this->name = $name;
    }
    public function show(){
        echo "大家好,我是Person类的对象" .$this->name. "<br>";
    }
    function __destruct(){//析构方法
        echo "对象被销毁";
    }
}
$Sunlight = new Person("Sunlight");
$Sunlight ->show();
?>

3.类常量和静态成员

3.1.类常量

  • cont PI=3.1415926; 定义一个常量
  • 在类中声明的变量属于类本身,调用时要使用范围解析符(::)连接类名和类常量来访问
    在这里插入图片描述
<?php
class MathTool {
    const PI=3.1415926;
    public function show(){
        echo MathTool::PI;
        echo "<hr>";
        echo self::PI;
    }
}
echo MathTool::PI;//在外部访问类的常量
echo "<hr>";
$ma = new MathTool();
$ma->show();

3.2.静态方法

  • 用static修饰
  • 在类中声明的静态方法属于类本身,不会随对象改变,调用时要使用范围解析符(::)连接类名和静态方法来访问
<?php
class Student {
    //定义show方法秘书处学生的学校名称
    public static $schoolName="JXNU";
    public static function show(){
        echo "My School is :".self::$schoolName;
    }
}
Student::show();

4.继承

  • class 子类名 extends 父类名 {// 类体}
  • parent关键词访问父类方法,用法和这里的self差不多,相当于java中的super
  • final关键词修饰后,类不可以被继承,方法不能被重写

5.自动加载和魔术方法

  • 类定义文件没有找到时,自动调用__autoload()函数。自动加载不能自己完成加载类的功能,具体加载代码要根据需要编写。

  • 魔术方法,不需要手动调用,在某一个时刻会自动执行

方法描述
__toString()输出一个对象时被调用,将对象转换为字符串
__sleep()对象序列化之前被调用,使程序延缓一段时间执行
__wakeup()对象反序列化时被调用,还原被序列化的对象
__get() __set()获取和设置私有变量
__construct() __destruct()构造和析构
__autoload()自动加载

6.抽象类和接口

6.1.抽象类

  • 抽象类定义:abstract class 类名(){ //类的成员 }
  • abstract function 方法名(); 没有函数体
  • 一个类继承了某个抽象类,必须实现抽象类的所有抽象方法
  • 抽象类不能被实例化

6.2.接口

  • interface Animal { public function run(); } 定义接口
  • implements 实现接口
<?php
interface Animal {
    public function run ();
    public function shout();
}
interface LandAnimal{
    public function LiveOnLand();
}
//定义dog类实现这两个接口:
class Dog implements Animal,LandAnimal{
    public function LiveOnLand(){
        echo "狗在陆地上生活<br>";
    }
    public  function  run(){
        echo "狗在奔跑<br>";
    }
    public function  shout()
    {
        echo "汪汪汪~~~~<br>";
    }
}
$dog = new Dog();
$dog->LiveOnLand();
$dog->run();
$dog->shout();

命名空间

  • 重名的类调用会导致错误,所以在一个php文件当中可以设置一个命名空间,这样别的文件就不会访问到这个命名空间里的类了
  • namespace DataCleaner; 定义命名空间
  • 命名空间必须写在程序脚本的第一条语句
  • 类、函数、常量都受命名空间的影响
  • 可以使用命名空间互相访问类
    在这里插入图片描述
  • 这里是采用完全限定名称来对不同php文件当中的类进行引用

二、错误处理及调试

1.错误类型

  • 1)语法错误:用户书写的代码不符合PHP的语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(Parse error)
  • 2)运行时错误:代码编译通过,但是代码在执行的过程中会出现一些条件不满足导致的错误(runtime error)
  • 3)逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不到想要的结果
  • 手动触发错误: trigger_error(“String”,$a) 字符串代表错误信息内容, $a代表指定的错误类别

2.错误处理

  • error_reporting()和ini_set()
  • die()函数
  • 已理解,不展开说明

3.异常处理

  • try catch 处理异常 throw抛出异常
  • 一个异常继承另一个异常就可以创建自定义异常
    在这里插入图片描述
<?php
//创建一个自定义的异常类CustomException,继承Exception
class CustomException extends  Exception{
    //定义错误方法:
    public function  errorMessage(){
    //定义错误信息的显示格式:
    $errorMsg = 'Error on line '.$this->getLine().
    ' in '.$this->getLine().'<b>'.$this->getMessage().
        '<b> is not a valid E-mail address';
    return $errorMsg;
    }
}
$email="someone@example...com";
try{
    //检查邮件地址是否合法:
    if (filter_var($email,FILTER_VALIDATE_EMAIL)===FAlSE){
        throw new CustomException($email);
    }
}
catch (CustomException $e){
    echo $e->errorMessage();//调用错误方法,输出错误信息
}

三、文件操作

1.文件概述

  • 文件流:输入流和输出流
  • 输入流:数据源(文件)到php语言程序的输入。输出流:php语言程序到数据源(文件)的输入。
  • 文件类型:file:普通文件类型,txt、png、exe…
  • dir:目录类型,目录也是文件的一种
  • unknown:未知类型
  • filetype()函数获取文件类型
  • fileexists() 判断文件是否存在

1.2.文件属性:

函数功能
filesize($filename)返回文件大小
filectime($filename)返回文件创建时间
filemtime($filename)返回文件修改时间
fileatime($filename)返回文件上次访问的时间
is_readable($filename)判断给定文件是否可读
is_writable($filename)判断给定文件是否可写
is_executable($filename)判断给定文件是否可执行
is_file($filename)判断给定文件是否为一个正常的文件
is_dir($filename)判断给定的文件是否是一个目录
stat($filename)返回文件的各种信息
  • 都需要提供一个$filename作为参数传入,这个参数就是文件地址的字符串,才能获取该具体文件的信息

2.文件操作

2.1.打开和关闭文件

  • foprn($filename, $mode)
  • filename可以是本地文件,还可以是url
  • mode为模式,r只读,r+读写,w写入,w+读写
  • a写入,文件指针在文件尾,a+读写,文件指针在文件尾
  • x创建并以写入方式打开,指针指向文件头,x+创建并以读写入方式打开
  • 关闭文件 fclose($filename)

2.2.读取文件

函数描述
fread($handle, $a)返回$handle指针所在位置指定长度 $a的字符串
fgetc($handle)返回指针所在位置读取的一个字符
fgets($handle, $a)返回指针所在位置读取的一行字符,可以指定长度 $a
file_get_contents( $f)将文件的内容全部读取到一个字符串里的首选方法
file($f)将整个文件读入到一个数组中,数组中的每一个元素都是文件里的一行,包括换行符

2.3.写入文件

  • fwrite($handle, $s, $len)
    $handle是fopen函数返回的指针位置,在此位置插入len长度的字符串s,len可省略
  • file_put_contents($f, $data, $a)
    向文件f中写入data数据, $a=FILE_APPEND代表追加写入,这个函数等于fopen+fwrite+fclose
    在这里插入图片描述
<?php
$filename="1.txt";
$content="777777\n";
$handle=fopen($filename,'w'); //fopen打开文件获取文件指针
fwrite($handle,$content);//写入数据、内容
fclose($handle);//关闭文件
echo "文件写入成昆";//成功,简简单单

2.4.其他操作

  • 复制文件:copy($指定文件, $目标文件)
  • 重命名文件:rename($oldname, $newname)
  • 删除文件:unlink($filename)成功返回true,失败返回false

3.目录操作

3.1.解析目录

  • basename($f, $后缀)函数,返回路径中的文件名,若设定 $后缀,则返回的文件名会删除指定后缀
  • dirname($路径) 返回路径中的目录部分

3.2.遍历目录

  • opendir($path)打开目录,返回一个目录的指针
  • readdir()读取目录,返回下一个文件的文件名
  • closedir()关闭目录
  • rewinddir()倒回目录句柄

3.3.创建和删除目录

  • mkdir($pathname)新建目录,目录名为pathname
  • rmdir()用于删除目录

4.文件上传与下载

4.1.文件上传

  • 先设置一个文件上传表单,这个表单提交方式必须为POST,再添加上传的属性enctype=“multipart/form-data”
    在这里插入图片描述
<form enctype="multipart/form-data" ,action="upload.php" ,method="POST">
        <input type="hidden" ,name="max_file_size" value="30000" /> 
        选择文件:<input type="file" name="userfile" />
        <input type="submit" value="上传文件" />
    </form>
  • 在当前脚本文件所在的目录中创建一个文件夹,用于储存上传的文件,然后实现文件的上传功能:
    在这里插入图片描述
<?php
//目标文件:
$destination='uploads/'.$_FILES['userfile']['name'];
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    if (move_uploaded_file($_FILES['userfile']['tmp_name'],$destination))
        echo "上传成功";
}

4.2.文件下载

  • 现在http消息中设置两个相应消息头,告诉浏览器不要直接在浏览器中解析该文件,而是将文件以下载的方式打开。

    示例:
    //指定文件的MIME类型:
    header("Content-type:image/jepg");
    //指定文件描述:
    header("Content-Disposition:attachment;filename=girl.jpg");
    
  • 接下来就是下载文件

<?php  
$file_name = "down";
$file_name = "down.zip";     //下载文件名    
$file_dir = "./down/";        //下载文件存放目录    
//检查文件是否存在    
if (! file_exists ( $file_dir . $file_name )) {    
    header('HTTP/1.1 404 NOT FOUND');  
} else {    
    //以只读和二进制模式打开文件   
    $file = fopen ( $file_dir . $file_name, "rb" ); 

    //告诉浏览器这是一个文件流格式的文件    
    Header ( "Content-type: application/octet-stream" ); 
    //请求范围的度量单位  
    Header ( "Accept-Ranges: bytes" );  
    //Content-Length是指定包含于请求或响应中数据的字节长度    
    Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );  
    //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
    Header ( "Content-Disposition: attachment; filename=" . $file_name );    

    //读取文件内容并直接输出到浏览器    
    echo fread ( $file, filesize ( $file_dir . $file_name ) );    
    fclose ( $file );    
    exit ();    
}    

四、HTTP协议

1.HTTP概述

  • HTTP即超文本传输协议,是一种请求/相应式的协议。客户端在与服务端建立连接后,由客户端向服务器发送的请求叫做HTTP请求,服务端接收到请求之后做出的响应叫做HTTP响应。
    在这里插入图片描述
  • 先建立TCP连接,在TCP连接上传送多个HTTP请求和响应。
  • 服务器必须按照客户端发送请求的先后顺序返回相应结果,以保证客户端能够区分出每次请求的相应内容

1.2.HTTP地址

  • HTTP地址=网页地址=统一资源定位符=url
  • 由协议、主机名、端口、路径等等组成

什么是url:

我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。因此,在我们认识HTTP之前,有必要先弄清楚URL的组成,例如:http://www.baidu.com/china/index.htm。它的含义如下:

  1. http://:代表超文本传输协议,通知baidu.com服务器显示Web页,通常不用输入;

  2. www:代表一个Web(万维网)服务器;

  3. baidu.com/:这是装有网页的服务器的域名,或站点服务器的名称;

  4. China/:为该服务器上的子目录,就好像我们的文件夹;

  5. Index.htm:index.htm是文件夹中的一个H搜索TML文件(网页)

网址(url)和域名的关系?

网址是打开网站的地址;

比如:http://zhidao.baidu.com/question/263101382.html?push=core&group=1这个是网址;

域名是zhidao.baidu.com,指http://前面到第一个/中间的一段。

域名和IP地址的关系?

ip是房子的门牌地址,域名是房子的主人名字。房子可以换主人,但是不能换地址。ip地址是Internet网中主机地址的一种数字标识,IP就使用这个地址在主机之间传递信息,而域名是互联网中用于解决地址对应问题的一种方法。域名像名字一样简单好记,可以广泛传播.

比如:

baidu.com

google.com

域名与IP地址的对应关系

对应关系有两种类型:

1、一对一

Internet上IP地址是唯一的,一个IP地址对应着唯一的一台主机。

给定一个域名地址能找到一个唯一对应的IP地址。

2、一对多

一台计算机提供多个服务,既作www服务器又作邮件服务器。

IP地址还是唯一,但可根据计算机提供的多个服务给予不同域名。

一个IP地址对应多个域名。

什么是DNS?

DNS: Domain Name System域名系统

人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

DNS和HOSTS比较?

相同点:都是把网址解析成IP地址

HOSTS文件相当于一个本地的小型DNS服务器,电脑会优先在本地的HOSTS文件中查找网址对应的IP,如果没有找到,才向DNS请求。

通俗地比方:DNS就是全市的电话黄页,HOSTS就是你的个人通讯本了。

2.HTTP请求

2.1.HTTP请求行

  • HTTP请求行位于请求消息的第一行,分别是请求方式、路径资源、HTTP协议版本
    在这里插入图片描述2.2.HTTP的八种请求方式:
    在这里插入图片描述2.3.GET方式
  • 如果浏览器请求的url中有参数部分,在浏览器生成的请求消息中,参数部分将附加在请求行中的资源路径后面。
  • "?“后面的内容为参数信息。参数由参数名和参数值组成,用”=“连接。如果url中有多个参数,则参数之间用”&"分隔。
  • GET方式传送的数据不能超过1kb大小

2.4.POST方式

  • 使用POST方式向服务器传递数据时,Content-Type消息头会自动设置为"application/x-www-form-urlencoded",Content-Length消息头会自动设置为实体内容的长度。
    在这里插入图片描述
  • POST请求传输数据无大小限制
  • POST请求比GET请求更安全

2.5.HTTP请求消息头

  • 向服务器传递附加消息,客户端可以接收的数据类型、压缩方法、语言、以及发送请求的连接所属页面的URL地址等信息
  • 每个消息头都是由一个头字段和一个值构成,头字段和值用冒号":“和空格” "分隔,每个请求消息头之后使用一个回车换行符标志结束。
  • 头字段名称不区分大小写,习惯上将单词的第一个字母大写
消息头说明
Accept可接受的响应内容类型(Content-Types)。
Accept-Charset可接受的字符集
Accept-Encoding可接受的响应内容的编码方式。
Accept-Language可接受的响应内容语言列表。
Accept-Datetime可接受的按照时间来表示的响应内容版本
Authorization用于表示HTTP协议中需要认证资源的认证信息
Cache-Control用来指定当前的请求/回复中的,是否使用缓存机制。
Connection客户端(浏览器)想要优先使用的连接类型
Cookie由之前服务器通过Set-Cookie(见下文)设置的一个HTTP协议Cookie
Content-Length以8进制表示的请求体的长度
Content-MD5请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果
Content-Type请求体的MIME类型 (用于POST和PUT请求中)
Date发送该消息的日期和时间(以RFC 7231中定义的"HTTP日期"格式来发送)
Expect表示客户端要求服务器做出特定的行为
From发起此请求的用户的邮件地址
Host表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。
If-Match仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后,该资源未被修改的情况下,才更新该资源。
Max-Forwards限制该消息可被代理及网关转发的次数。
Origin发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个Access-Control-Allow-Origin的消息头,表示访问控制所允许的来源)。
Pragma与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生。
Proxy-Authorization用于向代理进行认证的认证信息。
Range表示请求某个实体的一部分,字节偏移以0开始。
Referer表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。Referer其实是Referrer这个单词,但RFC制作标准时给拼错了,后来也就将错就错使用Referer了。
TE浏览器预期接受的传输时的编码方式:可使用回应协议头Transfer-Encoding中的值(还可以使用"trailers"表示数据传输时的分块方式)用来表示浏览器希望在最后一个大小为0的块之后还接收到一些额外的字段。
User-Agent浏览器的身份标识字符串
Upgrade要求服务器升级到一个高版本协议。
Via告诉服务器,这个请求是由哪些代理发出的。
Warning一个一般性的警告,表示在实体内容体中可能存在错误。

3.HTTP响应

3.1.HTTP响应状态行

  • 三个部分:HTTP协议版本、状态码、状态描述信息
    在这里插入图片描述
  • 响应码用于表示服务器对客户端请求的各种不同处理结果和状态
  • 三位的十进制数表示5中状态类别
状态码作用
1xx成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
2xx成功接收整个请求并已完成整个处理过程
3xx未完成请求,客户端需继续进一步细化请求
4xx客户端的请求有错误
5xx服务端出现错误
  • 302:表示请求的资源临时从不同的URL响应请求,但请求者应继续使用原有位置进行以后的请求
  • 例如:在请求重定向时,临时URL应该是响应的Location头字段所指向的资源。

3.2.HTTP响应消息头

  • 第一行是响应状态行,其余的内容都是响应消息头,相应消息头中包含了大量附加响应信息。
  • 包含服务程序名、被请求资源需要的认证方式、客户端请求资源的最后修改时间、重定向地址等信息
响应头说明
Access-Control-Allow-Origin指定哪些网站可以跨域源资源共享
Accept-Patch指定服务器所支持的文档补丁格式
Accept-Ranges服务器所支持的内容范围
Age响应对象在代理缓存中存在的时间,以秒为单位
Allow对于特定资源的有效动作;
Cache-Control通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒
Connection针对该连接所预期的选项
Content-Disposition对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,如:将其下载或是打开。
Content-Encoding响应资源所使用的编码类型。
Content-Language响就内容所使用的语言
Content-Length响应消息体的长度,用8进制字节表示
Content-Location所返回的数据的一个候选位置
Content-MD5响应内容的二进制 MD5 散列值,以 Base64 方式编码
Content-Range如果是响应部分消息,表示属于完整消息的哪个部分
Content-Type当前内容的MIME类型
Date此条消息被发送时的日期和时间(以RFC 7231中定义的"HTTP日期"格式来表示)
ETag对于某个资源的某个特定版本的一个标识符,通常是一个 消息散列
Expires指定一个日期/时间,超过该时间则认为此回应已经过期
Last-Modified所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
Link用来表示与另一个资源之间的类型关系,此类型关系是在RFC 5988中定义
Location用于在进行重定向,或在创建了某个新资源时使用。
P3PP3P策略相关设置
Pragma与具体的实现相关,这些响应头可能在请求/回应链中的不同时候产生不同的效果
Proxy-Authenticate要求在访问代理时提供身份认证信息。
Public-Key-Pins用于防止中间攻击,声明网站认证中传输层安全协议的证书散列值
Refresh用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
Retry-After如果某个实体临时不可用,那么此协议头用于告知客户端稍后重试。其值可以是一个特定的时间段(以秒为单位)或一个超文本传输协议日期。
Server服务器的名称
Set-Cookie设置HTTP cookie
Status通用网关接口的响应头字段,用来说明当前HTTP连接的响应状态。
Trailer Trailer用户说明传输中分块编码的编码信息
Transfer-Encoding用表示实体传输给用户的编码形式。包括:chunked、compress、 deflate、gzip、identity。
Upgrade要求客户端升级到另一个高版本协议。
Vary告知下游的代理服务器,应当如何对以后的请求协议头进行匹配,以决定是否可使用已缓存的响应内容而不是重新从原服务器请求新的内容。
Via告知代理服务器的客户端,当前响应是通过什么途径发送的。
Warning一般性警告,告知在实体内容体中可能存在错误。
WWW-Authenticate表示在请求获取这个实体时应当使用的认证模式。

五、PHP与Web页面元素交互

1.PHP执行过程

在这里插入图片描述

  • 1.HTTP请求:客户端浏览器输入url地址后,就会向指定服务器发送HTTP请求。在请求的同时,会附带一些相关信息,如消息头。
  • 2.Apache服务器处理:如果请求的是静态资源如HTML、CSS、图片 等文件,Apache就直接在服务器目录下获取这些文件。如果请求的是PHP文件,Apache则会将其交给PHP模块来处理,PHP模块将处理得到的结果以HTML的方式返回给Apache。
  • 3.返回HTTP响应数据:服务器将通过Apache获取到的静态资源通过HTTP响应发送到浏览器端。
  • 4.浏览器进行解析。

2.Web表单

2.1.表单的组成(按钮、文本框…)

2.2.获取表单数据

  • 提交时,一般都会通过method属性指定提交方式。
  • POST:全局数组$POST[] 来获取表单元素的值
  • GET:全局数组$GET[] 来获取表单元素的值

2.3.表单安全验证

  • 识别并处理用户输入的数据
  • strip_tags()函数、htmlentities()函数过滤表单数据
  • strip_tags()去除字符串中的HTML和PHP标签
  • htmlentities()将字符串中的HTML和PHP标签转换成字符,以文本形式输出

2.4.表单数据验证

  • isset()函数,检测变量是否检测变量是否已设置并且非 NULL,如果指定变量存在且不为 NULL,则返回 TRUE,否则返回 FALSE
  • empty()函数,检测变量是否具有空值,包括空字串、0、null或false,具有则返回TRUE
  • is_numeric()函数,必须是数字或数字字符串,否则返回FALSE

在这里插入图片描述

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>I am your daddy</title>
    <style>
        .error {color: #FF0000;}
    </style>
</head>
<body>

<?php
// 定义变量并默认设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST")
{
    if (empty($_POST["name"]))
    {
        $nameErr = "名字是必需的";
    }
    else
    {
        $name = test_input($_POST["name"]);
        // 检测名字是否只包含字母跟空格
        if (!preg_match("/^[a-zA-Z ]*$/",$name))
        {
            $nameErr = "只允许字母和空格";
        }
    }

    if (empty($_POST["email"]))
    {
        $emailErr = "邮箱是必需的";
    }
    else
    {
        $email = test_input($_POST["email"]);
        // 检测邮箱是否合法
        if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
        {
            $emailErr = "非法邮箱格式";
        }
    }

    if (empty($_POST["website"]))
    {
        $website = "";
    }
    else
    {
        $website = test_input($_POST["website"]);
        // 检测 URL 地址是否合法
        if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
        {
            $websiteErr = "非法的 URL 的地址";
        }
    }

    if (empty($_POST["comment"]))
    {
        $comment = "";
    }
    else
    {
        $comment = test_input($_POST["comment"]);
    }

    if (empty($_POST["gender"]))
    {
        $genderErr = "性别是必需的";
    }
    else
    {
        $gender = test_input($_POST["gender"]);
    }
}

function test_input($data)
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
?>

<h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
    名字: <input type="text" name="name" value="<?php echo $name;?>">
    <span class="error">* <?php echo $nameErr;?></span>
    <br><br>
    E-mail: <input type="text" name="email" value="<?php echo $email;?>">
    <span class="error">* <?php echo $emailErr;?></span>
    <br><br>
    网址: <input type="text" name="website" value="<?php echo $website;?>">
    <span class="error"><?php echo $websiteErr;?></span>
    <br><br>
    备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
    <br><br>
    性别:
    <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?>  value="female"><input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?>  value="male"><span class="error">* <?php echo $genderErr;?></span>
    <br><br>
    <input type="submit" name="submit" value="Submit">
</form>

<?php
echo "<h2>您输入的内容是:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>

3.超全局变量

$_POST

$_GET

$GLOBALS

$_SERVER

$_REQUEST

$_FILES

$_ENV

$_COOKIE

$_SESSION

  • 表单中的name属性代表的值,就是POST、GET[]中的值
  • $_REQUEST保存各种方式传递数据给PHP的数组变量,可以获取 $_POST、 $_GET、 $_COOKIE中的数据
    解析后,新的值会覆盖同名的旧值
  • $_SERVER在web服务器中保存页面交互信息,存放HTTP请求头和Web服务器信息
<?php 
echo $_SERVER['PHP_SELF'];//输出当前PHP脚本文件的相对路径
echo "<br>";
echo $_SERVER['SERVER_NAME'];//Web服务器的名字
echo "<br>";
echo $_SERVER['HTTP_HOST'];//Web服务器的地址
echo "<br>";
echo $_SERVER['HTTP_REFERER'];//链接到当前页面的前一页面的URL地址
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];//客户端操作系统和浏览器信息
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];//输出当前脚本文件的相对路径
?>
  • $GLOBALS 包含了全部变量的全局组合数组。变量的名字就是数组的键。
<?php 
$x = 75; 
$y = 25;
 
function addition() 
{ //用$GLOBALS[]获取全局变量x和y
    $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
}
addition(); 
echo $z; 
?>

六、PHP会话技术

  • Cookie是一种在远程浏览器端存储数据并以此来跟踪和识别用户的机制。Session是将信息存放在服务器的会话技术

1.Cookie技术

  • 创建cookie:setcookie($name, $value)
  • 读取cookie:超全局数组$_COOKIE[“键”]
  • 删除Cookie:用setcookie()设置value值为空

2.Session技术

2.1.概述

  • 网页也是一种无状态的连接程序,购物界面一直保持登录状态不会丢失,要用Session来实现
  • Web服务器在运行时, 为每一个用户的浏览器创建一个供其独享的Session文件。当用户再次访问时,可以直接从其独有的Session文件中获取信息。
  • Session会话时,在客户端会话ID存在COOKIE中,在服务器会话ID存在Session文件中。

2.2.Session操作

  • 启动Sesssion:session_start()
  • 向Session添加数据:超全局数组$_SESSION[“键”]=值
  • 读取Session中的数据:$value= $_SESSION[“键”]
  • 删除所有数据:$_SESSION=array() 赋值一个空的数组

七、正则表达式

<?php
/*
    1.方括号 []
        括号内为将来要匹配的字符。
    2.连字符 -
        连接字符串
        [A-Za-z]表示匹配英文大小写从A到z的任意字符串。
    3.点号字符 .
        表示通配符,代表所有字符和数字
       “.er”表示所有以er结尾的三个字符的字符串。如:ter per @er &er
    4.限定符 +*?{}
       “+”:前面的字符至少有一个。 例:“9+”表示目标字符串至少包含一个9
       “*”:前面的字符不止一个或零个。 例:“y*”表示目标字符串包含0或不止一个y
       “?”:前面的字符为一个或零。 例:“y?”表示目标字符串包含0或一个y
       “{}”:前面的字符串有多少个。 例:“a{3,5}”表示目标字符串包含3个或5个a  “a{3,}”表示目标字符串包含至少3个a
       “.*”:表示匹配任意字符串。
    5.行定位符 ^和$
        确定匹配字符串所要出现的位置。
        ^ :目标字符串在开头出现。 例:^xiaoming是指xiaoming只能出现在目标字符串开头
        $ :目标字符串在结尾出现。 例:8895$是指8895$只能出现在目标字符串结尾
        同时使用^$   例:“^[a-z]$”表示目标字符串只要包含从a到z的单个字符串
    6.排除字符 [^]
        表示一个逻辑“否”。
        [^0-9]例:表示目标字符串包含从0到9以外的任意其他字符串
    7.括号字符 ()
        表示子串,所有对包含在子串内字符的操作,都是以子串为整体进行的。
        把正则表达分成不同部分的操作符。
    8.选择字符 |
        表示“或”。 例:“com|cn|net”表示在目标字符串包含com或cn或net
    9.转义字符 反斜线 \
        如果单独使用,表示作为特殊字符的转义字符。
        如果表示\本身,则在字符前添加转义字符“\”,即“\\”
    10.认证 email 的正则表达
        email 的正则表达:^[A-Za-z0-9_.]+@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+$
        ^[A-Za-z0-9_.]+  表示至少有一个英文大小写字符、数字、下划线、点号或这些字符的组合,在开头
        @  表示“@”
        [A-Za-z0-9_]+  表示至少有一个英文大小写字符、数字、下划线或这些字符的组合。
        \.  表示“.com”之类的“.”,由于表示“.”本身,用“\”转义
        [A-Za-z0-9_.]+$  表示表示至少有一个英文大小写字符、数字、点号或这些字符的组合,并且直到此字符串的末尾
*/
    $email1 = "qijiyang2018@hotmail.com";
    $email2 = "The email is qixiaoshuai_2018@hotmail.com";
    $asmail = "The is qixiaoshuai_2018@hotmail";
    if (preg_match('/^[A-Za-z0-9_.]+@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+$/',$email1)){
        echo "This is an email."."<br/>";
    }
    if (preg_match('/^[A-Za-z0-9_.]+@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+$/',$email2)){
        echo "This is a new email."."<br/>";
    }else{
        echo "This is not an email."."<br/>";
    }
    if (preg_match('/^[A-Za-z0-9_.]+@[A-Za-z0-9_]+\.[A-Za-z0-9_.]+$/',$asmail)){
        echo "This is an email."."<br/>";
    }else{
        echo "This is not an email."."<br/>";
    }
    /* 运行结果:
        This is an email.
        This is not an email.
        This is not an email.
    */

表单验证匹配

验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$

验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-z A-Z]$

验证账号,不能有空格,不能非数字:^\d+$

验证用户密码,以字母开头,长度在 6-18 之间:^[a-zA-Z]\w{5,17}$

验证是否含有 ^%&',;=?$\ 等字符:[^%&',;=?$\x22]+

匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配腾讯QQ号:[1-9][0-9]{4,}

匹配日期,只能是 2004-10-22 格式:^\d{4}\-\d{1,2}-\d{1,2}$

匹配国内电话号码:^\d{3}-\d{8}|\d{4}-\d{7,8}$
评注:匹配形式如 010-12345678 或 0571-12345678 或 0831-1234567

匹配中国邮政编码:^[1-9]\d{5}(?!\d)$

匹配身份证:\d{14}(\d{4}|(\d{3}[xX])|\d{1})
评注:中国的身份证为 15 位或 18 位

不能为空且二十字节以上:^[\s|\S]{20,}$

字符匹配
匹配由 26 个英文字母组成的字符串:^[A-Za-z]+$

匹配由 26 个大写英文字母组成的字符串:^[A-Z]+$

匹配由 26 个小写英文字母组成的字符串:^[a-z]+$

匹配由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$

匹配由数字、26个英文字母或者下划线组成的字符串:^\w+$

匹配空行:\n[\s| ]*\r

匹配任何内容:[\s\S]*

匹配中文字符:[\x80-\xff]+ 或者 [\xa1-\xff]+

只能输入汉字:^[\x80-\xff],{0,}$

匹配双字节字符(包括汉字在内):[^\x00-\xff]

匹配数字
只能输入数字:^[0-9]*$

只能输入n位的数字:^\d{n}$

只能输入至少n位数字:^\d{n,}$

只能输入m-n位的数字:^\d{m,n}$

匹配正整数:^[1-9]\d*$

匹配负整数:^-[1-9]\d*$

匹配整数:^-?[1-9]\d*$

匹配非负整数(正整数 + 0):^[1-9]\d*|0$

匹配非正整数(负整数 + 0):^-[1-9]\d*|0$

匹配正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

匹配负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$

匹配浮点数:^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

匹配非负浮点数(正浮点数 + 0):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

匹配非正浮点数(负浮点数 + 0):^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

其他
匹配HTML标记的正则表达式(无法匹配嵌套标签):

<(\S*?)[^>]*>.*?</\1>|<.*? />

匹配网址 URL :[a-zA-z]+://[^\s]*

匹配 IP 地址:
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)

匹配完整域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值