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);
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);
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;
其他字符串函数:
- preg_filter — 执行一个正则表达式搜索和替换
- preg_grep — 返回匹配模式的数组条目
- preg_last_error — 返回最后一个PCRE正则执行产生的错误代码
- preg_match_all — 执行一个全局正则表达式匹配
- preg_match — 执行匹配正则表达式
- preg_quote — 转义正则表达式字符
- preg_replace_callback_array — Perform a regular expression search and replace using callbacks
- preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调进行替换
- preg_replace — 执行一个正则表达式的搜索和替换
- preg_split — 通过一个正则表达式分隔字符串
二、日期与时间
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);//释放资源
例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);//释放资源
例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