Web开发-PHP基础篇(三)

又继续学习了PHP的学习教程,正则表达式、日期与时间、图像处理、文件与目录操作和会话控制。感觉都十分重要,于是在学习中做了认真总结,总结如下

一、正则表达式

1、正则表达式语法规则

​ 描述了一类字符串的特征,然后通过这个特征可以配合一些特定的函数,来完成对字符串更加复杂的一系列操作!
​ 普通字符和特殊字符组成的一个字符串

如:

$a='/test/';
$str='abctest123456a';
var_dump(preg_match_all($a,$str,$b));//检查$str里是否有$a中的内容(test),并匹配给$b
var_dump($b);

2、定界符

​ 我们一般习惯使用正斜线/作为定界的字符。除了字母、数字和反斜线以外的字符都可以作为定界符(# ! {} |),前后要一致

3、普通字符

a-z、A-Z、0-9、双引号、单引号,都没有特殊的含义

4、元字符

\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个除十进制数字以外字符,等价于[^0-9]
\s 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符
\S 匹配除空白字符以外的任何一个字符
\w 匹配任意一个数字或字母或下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
. 匹配除换行符以外的任意一个字符
如:

$a='/te.st/';//单纯只用".",需要用反斜线“\”转义
$str='abcte3st123456a';
var_dump(preg_match_all($a,$str,$b));
var_dump($b);//输出1
*	匹配0次、或1次、或多次其前面的字符//.*配合使用默认情况下是贪婪匹配(尽可能多的去匹配字符)
+	匹配1次或多次其前面的字符
?	匹配0次或1次其前面的字符//.*配合后面加个?懒惰匹配
{n}	表示其前面字符恰好出现n次
{n,}	表示其前面字符出现不少于n次
{n,m}	表示其前面的字符至少出现n次,最多出现m次

^或\A	匹配字符串开始位置
$或者\Z	匹配字符串的结束位置//^与$配合使用:$a='/^test$/';

|	匹配两个或多个模式//$a='/test|abc/';

[]	匹配方括号中的任意一个字符//$a='/t[eabcd]st/';
[^]	匹配除方括号中字符以外的任意一个字符/$a='/t[^e]st/';

()	将括号中作为一个整体以便将其中的内容获取到
	在我们的正则表达式中 可以使用圆括号来将某一段括起来,在圆括号的后面部分,我们可以使用
	\\数字 来代表圆括号部分所匹配到的内容!
例:$a='/t(e)st\\1/';//除了匹配字符串test,还匹配到了字符e。\\1代表第一个圆括号所匹配到的内容‘/teste/’
$str='  test   ';

5、模式修正符

常见模式修正符
i 在和模式进行匹配时不区分大小写

例:$a='/test/i';

m 多行匹配,如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响

使用条件:

(1)目标字符串中必须包含“\n”

(2)正则表达式中必须要出现^或$

模式修正符m的作用:多行匹配

例:

$pattern='/test$/m';
$str="test\ntest\n";

$pattern='/test\r*$/m';
$str="test
test
test";//最后一个匹配不到,所以加*
//在windows操作系统中所看到的换行(现象),其实是通过两个字符来完成的(\r\n)
//在Linux操作系统中所看到的换行(现象),其实是通过(\n)来完成的

s 如果设定了此修正符,那么.将匹配所有的字符包括换行符

例:

$pattern='/t.st/s';

$str="t\st"//可以匹配到“\”

U 禁止贪婪匹配

例:

$pattern='/a.*f/U';//等价于$pattern='/a.*?f/';
$str="  adwqfsav  avsfaf";

模式修正符是可以多个搭配使用的

6、与正则表达式配合的函数

常用:

preg_match_all — 执行一个全局正则表达式匹配

参数说明:

第四个参数(可选):
PREG_PATTERN_ORDER
PREG_SET_ORDER
PREG_OFFSET_CAPTURE
第五个参数(可选):可以传一个值,来表示从目标字符串的哪个位置开始搜索(单位是字节)

$pattern='/a.*f/U';//等价于$pattern='/a.*?f/';
$str="  adwqfsav  avsfaf";
var_dump(preg_match_all($pattern,$str,$arr));
var_dump($arr);

Web开发-PHP基础篇(三)_Web

preg_match — 执行匹配正则表达式

匹配一次就结束,匹配不到返回0

参数说明:
第一个参数:正则表达式
第二个参数:目标字符串
第三个参数(可选):放一个变量,执行完成之后,里面会有匹配到的部分以及等等一些数据!
第四个参数(可选):可以传PREG_OFFSET_CAPTURE进入(那么第三个参数那个变量里面的数据就会有匹配到的部分的偏移值),默认传的是0
第五个参数(可选):可以传一个值,来表示从目标字符串的哪个位置开始搜索(单位是字节)

$pattern='/a.*f/U';//等价于$pattern='/a.*?f/';
$str="  adwqfsav  avsfaf";
var_dump(preg_match($pattern,$str,$arr,PREG_OFFSET_CAPTURE));
var_dump($arr);

Web开发-PHP基础篇(三)_Web_02
preg_replace — 执行一个正则表达式的搜索和替换

参数说明:
第一个参数:正则表达式
第二个参数:要替换成的字符串
第三个参数:目标字符串
第四个参数(可选):默认是-1,就是替换所有符合特征部分的!
第五个参数(可选):你可以放一个变量在这边

$pattern='/<div(.*?)>(.*?)<\/div>/';
$str1='<a$1 href="http://www.baidu.com">$2</a>';
$str='dwqdwq<div style="color:red;font-size:25px;">测试成为绯闻绯闻绯闻绯dwqdwqdwq闻cqdwqdqw</div>dqwwdqdwq<div>我是后面那个div</div>';
if(preg_match($pattern, $str,$arr)){
	echo '替换后的:'.preg_replace($pattern, $str1, $str,-1,$count);
	var_dump($count);
}else{
	echo '对不起,没有找到!';
}
echo '<br /><br /><br /><br />';
echo '原来的字符串:'.$str;

传数组

//preg_replace第一个参数与第二个参数传数组,一一对应的去替换!
$pattern=array(
		'/<div(.*?)>(.*?)<\/div>/',
		'/<p(.*?)>(.*?)<\/p>/'
);
$str1=array(
		'<a$1 href="http://sifangku.com">$2</a>',
		'<span$1>我是span标签啦!$2</span>'
);
$str='dwqdwq<div style="color:red;font-size:25px;">测试成为绯闻绯闻绯闻绯dwqdwqdwq闻cqdwqdqw</div>dqwwdqdwq<p>我是后面那个div</p>';

echo '替换后的:'.preg_replace($pattern, $str1, $str,-1,$count);
var_dump($count);
echo '<br /><br /><br /><br />';
echo '原来的字符串:'.$str;

其他字符串函数:

二、日期与时间

1、设置时区

date_default_timezone_set('Asia/Shanghai');//设置时区

2、获取当前Unix时间戳

Unix时间戳:从Unix纪元(格林威治时间1970年1月1日00时00分00秒)开始到当前的秒数

time()

3、获取指定时间的Unix时间戳

//mktime()
date_default_timezone_set('Asia/Shanghai');//设置时区
$nowTime=time();
$time1=mktime(0,0,0,10,1,2014);//取得一个日期的 Unix 时间戳
echo '距离2014年国庆还有'.(($time1-$nowTime)/60/60/24).'天';

4、从Unix时间戳取得时间日期信息
**date()**格式化一个本地时间/日期
第一个参数:必填,写上你所需要的时间日期的格式,把format 字符放在第一个参数里面会被转换成对应的信息,其他的字符还是原来的样子

date('Y-m-d G:i:s')//Y:年 m:月 d:日 G:时 i:分 s:秒 

自定义格式化Unix时间戳 为指定的时间格式。可以查询php使用手册:date()
5、获取Unix时间戳和微秒数

microtime() 返回当前 Unix 时间戳和微秒数
var_dump(microtime());
var_dump(microtime(true));//返回一个浮点数
round()//指定精度`如:round($a,4)//四舍五入$a,保留4位小数

三、图像处理

学前需要了解:在PHP中可以通过GD库处理图像(php的扩展库)
创建一个图像应该完成如下所示的四个基本步骤:
1.创建图像

1.创建新的

  imagecreatetruecolor()//新建一个真彩色图像

2.打开服务器或网络文件中已经存在的GIF,JPEG,PNG,WBMP格式图像

imagecreatefromjpeg()

imagecreatefrompng()

imagecreatefromgif()

imagecreatefromwbmp()

创建或者打开失败的时候会返回空字符串,并且输出一条错误信息。

imagesx()//输出画布宽度

imagesy()//输出画布高度

getimagesize()//取得图像大小

2.绘制图像

图像创建完成以后,就可以通过这个图像资源,使用各种画像函数设置图像的颜色、填充图像、画点、线段、以及向图像的添加文本等

1.imagecolorallocate()//分配颜色

2.imagefill()//区域填充

3.imagesetpixel()//画一个单一像素

4.imageline()//画一条线段

5.imagerectangle()//画一个矩形

6.imagestring()//水平地画一行字符串

7.imagettftext()//用 TrueType 字体向图像写入文本

8.imagettfbbox()//计算 TrueType 文字所占区域

9.imagecopy()//拷贝图像的一部分

10.imagecopymerge()//拷贝并合并图像的一部分

11.imagecopyresampled()//重采样拷贝部分图像并调整大小

3.输出图像

header('Content-type:image/jpeg');//输出图像为jpeg时

​ header函数注意点
​ 在该函数之前,不能输出任何内容
​ 在我们的PHP代码 的函数里面,我们使用的/开头的路径 这个/不是指 web根目录,而是操作系统的 文件的根目录!
4.释放资源

设计验证码的步骤:

水印

缩放与裁剪
imagecopyresampled()函数
采样某个图像资源的 某一部分 到 另外一个图像资源上面去

例1(jpeg图像):

header('Content-type:text/html;charset:utf-8');//设置编码
header('Content-type:image/jpeg');//输出图像为jpeg时
$img=imagecreatetruecolor(200,100);//新建一个宽200高100的真彩色图像
$color1=imagecolorallocate($img,20,40,255);//分配颜色,采用RGB格式
$color2=imagecolorallocate($img,70,80,90);
imagefill($img,0,0,$color1);//区域填充,从左上角0,0处进行填充
imagejpeg($img);//输出图像为jpeg格式
/*if(imagejpeg($img,'1.jpeg')){
    echo '保存成功';
}//加参数是保存图像,可以写相对路径*/
imagecopyresampled($img);//释放资源

Web开发-PHP基础篇(三)_正则表达式_03

例2(验证码):

header('Content-type:text/html;charset:utf-8');//设置编码
header('Content-type:image/jpeg');//输出图像为jpeg时

$width=120;//图像宽
$height=40;//图像高

$element=array('a','b','c','d','e','f','g','h','i','j','k','m','n','o','p','q','r','s','t','u','v','w','x','y','z');//字符串所包含字符
$string='';//初始化字符
for ($i=0;$i<5;$i++){//字符串字符个数
	$string.=$element[rand(0,count($element)-1)];//每次在$element随机选择字符并赋给$string
}

$img=imagecreatetruecolor($width, $height);//创建图像

$colorBg=imagecolorallocate($img,rand(200,255),rand(200,255),rand(200,255));//背景颜色,RGB格式,且RGB在200到255随机
$colorBorder=imagecolorallocate($img,rand(200,255),rand(200,255),rand(200,255));//边框颜色,RGB格式,且RGB在200到255随机
$colorString=imagecolorallocate($img,rand(10,100),rand(10,100),rand(10,100));//字符串颜色,RGB格式,且RGB在10到100随机

imagefill($img,0,0,$colorBg);//区域填充
imagerectangle($img,0,0,$width-1,$height-1,$colorBorder);//画一个宽为119,高为39的矩形。并显示边框颜色
for($i=0;$i<100;$i++){//画了100个点,并在矩形里随机分布。点的颜色,RGB格式,且RGB在100到200随机
	imagesetpixel($img,rand(0,$width-1),rand(0,$height-1),imagecolorallocate($img,rand(100,200),rand(100,200),rand(100,200)));
}
for($i=0;$i<3;$i++){//画了3条线
	imageline($img,rand(0,$width/2),rand(0,$height),rand($width/2,$width),rand(0,$height),imagecolorallocate($img,rand(100,200),rand(100,200),rand(100,200)));
}
//imagestring($img,5,0,0,'abcd',$colorString);//不太常用,一般用下面这种方式
imagettftext($img,19,rand(-5,5),rand(5,15),rand(30,35),$colorString,'font/Inkfree.ttf',$string);
//19是字体大小  rand(-5,5)是偏转角度从-5到5的随机角度  rand(5,15)和rand(30,35)是宽和高的范围  $colorString是字体颜色  'font/Inkfree.ttf'是使用字体样式的路径  $string是字符串
imagejpeg($img);//输出图像
imagedestroy($img);//释放资源

Web开发-PHP基础篇(三)_html_04

例3(文字水印):

header('Content-type:text/html;charset:utf-8');//设置编码
header('Content-type:image/jpeg');//输出图像为jpeg时

$img=imagecreatefromjpeg('images/1.jpg');//打开images文件下的1.jpg图片(也可以打开浏览器上的图片,写图片地址)
$color=imagecolorallocate($img,255,255,255);//颜色

$width=imagesx($img);//取得图像宽度
$height=imagesy($img);//取得图像高度
$position=imagettfbbox(20,0,'font/Inkfree.TTF','qwzf');
$stringWidth=$position[2]-$position[0];//水印宽度

imagettftext($img,20,0,$width-1-$stringWidth-($width/30),$height-1-($height/30), $color,'font/Inkfree.TTF','qwzf');
//$width-1-$stringWidth-($width/30),$height-1-($height/30)把水印放在右下角
imagejpeg($img);//输出图像
imagedestroy($img);//释放资源

例4(图片水印):

header('Content-type:image/jpeg');
$img=imagecreatefromjpeg('images/zcx.jpg');
$waterMark=imagecreatefromgif('images/watermark.gif');
$color=imagecolorallocate($img,255,255,255);

$width=imagesx($img);
$height=imagesy($img);

$waterMarkWidth=imagesx($waterMark);
$waterMarkHeight=imagesy($waterMark);

$position=imagettfbbox(20,0,'font/Inkfree.TTF','qwzf');
$stringWidth=$position[2]-$position[0];
//文字水印
//imagettftext($img,20,0,$width-1-$stringWidth-($width/30),$height-1-($height/30), $color,'font/china1.TTF','小刚/周传雄');

/*
imagecopy($img,$waterMark,100,100,0,0,$waterMarkWidth,$waterMarkHeight);
参数说明:
$img:目标图像资源
$waterMark:水印的图像资源
100:所要拷贝到目标图像资源上面的坐标(x轴位置)
100:所要拷贝到目标图像资源上面的坐标(y轴位置)
0:从水印的图像资源的x坐标为0的位置开始拷贝
0:从水印的图像资源的y坐标为0的位置开始拷贝
$waterMarkWidth:所要拷贝的水印图像的长度
$waterMarkHeight:所要拷贝的水印图像的高度
*/

imagecopy($img,$waterMark,$width-1-$waterMarkWidth,$height-1-$waterMarkHeight,0,0,$waterMarkWidth,$waterMarkHeight);

imagejpeg($img);
imagedestroy($img);

例5(裁剪和收缩):

//等比例缩放(裁剪)
header('Content-type:image/jpeg');
$img=imagecreatefromjpeg('images/zcx.jpg');

$imgWidth=imagesx($img);
$imgHeight=imagesy($img);

$height=$width/($imgWidth/$imgHeight);
$img1=imagecreatetruecolor($width,$height);
/*
imagecopyresampled($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
参数说明:
$dst_image:目标图像资源
$src_image:源图像资源(你要采样的那个图像资源)
$dst_x:
$dst_y:与上面的$dst_x确定了一个坐标,把采样到的部分 放到目标图像资源的什么位置
$src_x:
$src_y:与上面的$src_y确定了一个坐标,你要采样的原图像资源的 某个部分的起始坐标
$dst_w:
$dst_h:与上面的$dst_w确定了 放到目标图像资源上面的尺寸
$src_w:
$src_h:与上面的$src_w确定了 采样原图像资源的 某个部分

*/
imagecopyresampled($img1,$img,0,0,0,0,$width,$height,$imgWidth,$imgHeight);
//裁剪
//imagecopyresampled($img1,$img,0,0,0,0,100,100,100,100);
if(imagejpeg($img1)){
	imagejpeg($img1,'images/zoom_zcx.jpg');
}
imagedestroy($img);
imagedestroy($img1);

五、文件与目录操作

任何数据类型变量所存储的数据,都是在程序运行时才加载到内存中,而不能持久保存,那么如果需要将数据长久的保存起来,主要有两种办法,保存到普通文件中或者保存到数据库中。PHP可以在服务器上生成目录,创建、编辑、删除、修改文件属性等操作

1、判断普通文件和目录

	1.is_file()//判断给定文件名是否为一个正常的文件(如:文件)
	2.is_dir()//判断给定文件名是否是一个目录(如:文件夹)

2、文件的属性

	1.file_exists()//检查文件或目录是否存在
	2.filesize()//取得普通文件大小(字节)
	3.is_readable()//判断给定文件名是否可读
	4.is_writable()//判断给定的文件名是否可写
	5.filectime()//获取文件的创建时间
	6.filemtime()//获取文件的修改时间
	7.fileatime()//取得文件的上次访问时间
	8.stat()//获取文件大部分属性值

3、目录的基本操作

	1.basename()//返回路径中的文件名部分
	2.dirname()//返回路径中的目录部分
	3.pathinfo()//返回文件路径的信息
	4.opendir()//打开目录句柄
	5.readdir()//从目录句柄中读取条目,返回目录中下一个文件的文件名
	6.rewinddir()//倒回目录句柄
	7.closedir()//关闭目录句柄
	8.mkdir()//新建目录
	9.rmdir()//删除指定的空目录
	10.scandir()//列出指定路径中的文件和目录

4、文件的基本操作

	1.fopen()//打开文件或者 URL r只读 r+读写
	2.fread()//读取文件
	3.fgets()//从文件指针中读取一行
	4.feof()//测试文件指针是否到了文件结束的位置
	5.fwrite()//写入文件,返回写入的字节数
	6.rewind()//倒回文件指针的位置
	7.flock()//轻便的咨询文件锁定
	8.ftruncate()//将文件截断到给定的长度
	9.fclose()//关闭一个已打开的文件指针
	10.file() //把整个文件读入一个数组中
	11.copy()//拷贝文件
	12.unlink()//删除文件
	13.file_get_contents()//将整个文件读入一个字符串
	14.file_put_contents()//将字符串写入文件中
	15.rename()//重命名一个文件或目录
	16.readfile()//读入一个文件并写入到输出缓冲

例:

$file=fopen('1.txt','r');//打开1.txt文件,只读
var_dump(fread($file,2));//读取两个字节
var_dump(fgets($file));//读一行

5、文件的上传
文件的上传的过程这些细节是不需要管的,都是自动的,上传的文件默认是放在一个临时的目录里面的,我们要做的就是把这些临时目录里面的文件移动到我们需要的地方

1.html标签需要做的上传设置

(1) form标签属性设置

​ <1>method设置为post

​ <2>enctype设置为multipart/form-data

​ <3>form表单中设置隐藏类型的input,其中name值设置为MAX_FILE_SIZE,VALUE值设置为需要限制的上传文件的大小(单位为字节)

2.在服务器端通过PHP处理上传文件,涉及到下面的几条信息

(1)与上传有关的 php配置选项(php.ini)

     配置项                          可能值                             功能描述
  file_uploads                       ON                        确定服务器上的PHP脚本是否可以接受HTTP文件上传

  memory_limit                       8M                        设置脚本可以分配的最大内存量,防止失控的脚本独占服务器内存

  upload_max_filesize                2M                        限制PHP处理上传文件的最大值,此值必须小于post_max_size值

  post_max_size                      8M                        限制通过POST方法可以接受的信息最大量

  upload_tmp_dir                     F:/wamp/tmp               上传文件存放的临时路径,可以是一个绝对路径。这个目录对于拥有此服务器进程用户必须是可写的。

(2)$_FILES多维数组:用于存储各种与上传有关的信息

​ $_FILES[‘file’][‘name’] 客户端机器文件的原名称,包含扩展名

​ $_FILES[‘file’][‘size’] 已上传文件的大小,单位为字节

​ $_FILES[‘file’][‘tmp_name’] 文件上传之后,在服务器端存储的临时文件名

​ $_FILES[‘file’][‘error’] 文件上传时产生的错误

​ 0:表示没有发生任何错误,文件上传成功

​ 1:表示上传文件的大小超出了再PHP配置文件中upload_max_filesize选项限制的值

​ 2:表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值

​ 3:表示文件只被部分上传

​ 4:表示没有上传任何文件

​ $_FILES[‘file’][‘type’] 获取客户端上传文件的MIME类型,MIME类型规定了各种文件格式的类型。每种MIME类型都是由/分隔的主类型和子类型组成

(3)PHP的文件上传处理函数:用于上传文件的后续处理

​ <1>is_uploaded_file()判断指定的文件是否通过HTTP POST上传的

​ <2>move_uploaded_file()文件上传后,首先会存储于服务器的临时目录中,可以使用该函数将上传的文件移动到新位置

6、文件的下载

(1)发送指定的文件MIME类型的头信息

header('Content-type:MIME类型');

(2)指定下载文件的描述

 header('Content-Disposition:attachement;filename=文件名称');

(3)指定下载文件的大小

 header('Content-Length:文件大小');

(4)读取文件内容至输出缓冲区

 readfile();

获取文件的MIME类型:http://localhost/php/index.php
就相当于:localhost/php/a.rar

六、会话控制

1、cookie的设置、读取与删除

客户端电脑中设置

header('Content-type:text/html;charset=utf-8');
var_dump(setcookie('username','password',time()+3600));
//var_dump(setcookie('member[username]','password',time()+3600));//将多维数组应用于Cookie中

服务器端上读取

var_dump($_COOKIE);//超全局变量,在服务器端上读取Cookie的内容

删除

header('Content-type:text/html;charset=utf-8');
var_dump(setcookie('username','',time()-1));//删除Cookie
/*foreach($_COOKIE['member'] as $key=>$val){//遍历数组删除cookie
	var_dump(setcookie('member[{$key}]','',time()-3600));
}*/

**注意:**使用setcookie删除cookie的时候,需要与当初设置cookie的时候参数一致

2、session的开启、存储与销毁

返回一个分配好的session id

把这个id保存在客户端的cookie里面

id对应的数据都是保存在服务器端

开启

session_start();

(1)开启一个会话
(2)打开已经存在的会话
根据客户端传来的session id 把这个 session id 对应的数据 读取到$_SESSION这个变量里面

存储

header('Content-type:text/html;charset=utf-8');
session_start();
$_SESSION['name']='qwzf';
$_SESSION['email']='1739381035@qq.com';

读取

header('Content-type:text/html;charset=utf-8');
session_start();//开启会话
var_dump($_SESSION);//接收服务器端返回的数据,并输出
//var_dump($_COOKIE);//输出cookie
//var_dump(session_name());//session_name()获取cookie名称

销毁

session_start();//打开要销毁的会话
session_unset();//Free all session variables销毁变量
session_destroy();//销毁一个会话中的全部数据
setcookie(session_name(),'',time()-3600,'/');//销毁保存在客户端的session id  //“/”Web根目录

3、基于cookie或session的登录模块

COOKIE

login.php的源代码

<?php 
header('Content-type:text/html;charset=utf-8');
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	exit('您已经登录请不要重复登录');
}
if(isset($_POST['submit'])){
	if(isset($_POST['username']) && isset($_POST['password']) && $_POST['username']==='admin' && $_POST['password']==='admin'){
		if(setcookie('username',$_POST['username'],time()+3600)){
			header('Location:index.php');
		}else{
			echo 'cookie设置失败!';
		}
	}else{
		echo "您的用户名或密码输入有误,<a href=login.php>请重新登录!</a>";
	}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>请登录</title>
</head>
<body>
<form method="post" action="login.php">
	用户名:<input type="text" name="username" /><br />
	密码:<input type="password" name="password" />
	<input type="submit" name="submit" value="登录" />
</form>
</body>
</html>

index.php的源代码

<?php 
header('Content-type:text/html;charset=utf-8');
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	echo "{$_COOKIE['username']}您好,欢迎回来!";
	echo "<a href='logout.php'>注销</a>";
}else {
	echo "<a href='login.php'>请登录</a>";
}
?>

logout.php的源代码

<?php 
header('Content-type:text/html;charset=utf-8');
if (isset($_COOKIE['username']) && $_COOKIE['username']==='admin') {
	if(setcookie('username',$_POST['username'],time()-3600)){
		header('Location:login.html');
	}else{
		echo "<script type='text/javascript'>alert('注销失败');location='index.php';</script>";
	}
}
?>

SESSION

login.php的源代码

<?php 
session_start();
header('Content-type:text/html;charset=utf-8');
if (isset($_SESSION['username']) && $_SESSION['username']==='admin') {
	exit('您已经登录请不要重复登录');
}
if(isset($_POST['submit'])){
	if(isset($_POST['username']) && isset($_POST['password']) && $_POST['username']==='admin' && $_POST['password']==='admin'){
		$_SESSION['username']=$_POST['username'];
		header('Location:index.php');
	}else{
		echo "您的用户名或密码输入有误,<a href=login.php>请重新登录!</a>";
	}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>请登录</title>
</head>
<body>
<form method="post" action="login.php">
	姓名:<input type="text" name="username" />
	密码:<input type="password" name="password" />
	<input type="submit" name="submit" value="登录" />
</form>
</body>
</html>

index.php的源代码

<?php 
session_start();
header('Content-type:text/html;charset=utf-8');
if (isset($_SESSION['username']) && $_SESSION['username']==='admin') {
	echo "{$_SESSION['username']}您好,欢迎回来!";
	echo "<a href='logout.php'>注销</a>";
}else {
	echo "<a href='login.php'>请登录</a>";
}

?>

logout.php的源代码

<?php 
session_start();
header('Content-type:text/html;charset=utf-8');
if (isset($_SESSION['username']) && $_SESSION['username']==='admin') {
	session_unset();//Free all session variables销毁变量
	session_destroy();//销毁一个会话中的全部数据
	setcookie(session_name(),'',time()-3600,'/');//销毁保存在客户端的session id
	header('Location:login.html');
}else{
	echo "<script type='text/javascript'>alert('注销失败');location='index.php';</script>";
	
}
?>

总结完毕,总结练习过程中收获是巨多的。一起继续努力吧!小白进阶ing