更新时刻:2016年10月14日15点21分01秒,发布者:
本课程借助PHP编程语言及Web前端技术,成功打造了一个网站注册登录界面,涉及PHP编程技能的学习与实践,对感兴趣的同学来说,是一个值得参考的实例。
本文主要阐述了如何利用PHP技术构建用户注册与登录系统,该系统包含四个主要模块:一是设计前端界面,二是生成验证码,三是实现注册和登录功能,四是进行功能优化。更多细节,敬请继续阅读。
验证码制作
一、实验简介
本次实验旨在引导大家运用面向对象的理念来构建一个验证码模块,并在注册及登录页面中实际应用这一模块。通过参与此次实验,你将深入理解 PHP 的面向对象编程(OOP)理念,掌握 GD 库的运用技巧,以及验证码的生成方法。
1.1 涉及到的知识点
1.2 开发工具
这是一款便捷高效的文字处理工具。在桌面的左下角,您可以通过以下路径进入:应用程序菜单,选择开发选项。
二、封装验证码类
2.1 建立目录以及准备字体
在 web 文件夹中创建一个名为 admin 的子文件夹,将其作为我们的管理后台文件夹,并将后台的代码文件存放于此。在 admin 文件夹内部,再设立一个专门的 fonts 文件夹,该文件夹将用于储存制作验证码所必需的字体资源。
在admin目录中创建一个.php文件,该文件正是我们计划进行编辑的验证码相关类文件。
当前目录层次结构:

编辑 .php 文件:
添加该类的私有属性和构造方法:
string = 'qwertyupmkjnhbgvfcdsxa123456789'; // 删除了部分相似的字母 $this->codeNum = $codeNum; $this->height = $height; $this->width = $width; $this->lineFlag = $lineFlag; $this->piexFlag = $piexFlag; 此对象的字体属性被设置为当前文件所在目录下的'fonts'子目录中的'consola.ttf'字体文件。 $this->fontSize = $fontSize; } }字体文件可通过以下命令下载到 fonts 目录:
$ wget
接下来开始编写具体的方法:
创建图像资源句柄
//创建图像资源 此操作创建了图像资源,其尺寸为宽度:$this->width,高度:$this->height,通过调用imagecreate函数实现。 使用imagecolorallocate函数为图像分配颜色,选取的RGB值均在0到100之间,以此实现背景的浅色填充。 }用到的相关函数
创建验证码字符串并输出到图像
//创建验证码 public function createCode(){ 将字符串长度减一赋值给变量$strlen。 for ($i=0; $i < $this->codeNum; $i++) { 将随机选取的四个字符从字符集中连接,此操作被加入到代码字符串中。 } 将代码信息存入会话变量中,具体操作是将当前实例的code属性值赋值给$_SESSION数组中的code键。 //计算每个字符间距 计算差异值时,将宽度除以编码数量,得到 $diff。 for ($i=0; $i < $this->codeNum; $i++) { //为每个字符生成颜色(使用深色) 在分配图像颜色时,我使用了imagecolorallocate函数,为当前图像img指定了一个随机生成的RGB颜色值,该值由三个随机数组成,每个数介于100到255之间。 //写入图像 调用imagettftext函数,将文本输出至图像中,设定字体大小为当前对象字体大小,随机偏移角度在-30至30度之间,位置坐标为差值乘以索引加上随机偏移量,垂直位置在20至对象高度减10之间,使用指定文本颜色,指定字体文件,以及当前对象的编码数组中的第i个元素。 } }用到的相关函数
创建验证码字符串并输出到图像
//创建验证码 public function createCode(){ $strlen = strlen($this->string)-1; for ($i=0; $i < $this->codeNum; $i++) { $this->code .= $this->string[mt_rand(0,$strlen)]; //从字符集中随机取出四个字符拼接 } $_SESSION['code'] = $this->code; //加入 session 中 //计算每个字符间距 $diff = $this->width/$this->codeNum; for ($i=0; $i < $this->codeNum; $i++) { //为每个字符生成颜色(使用深色) $txtColor = imagecolorallocate($this->img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255)); //写入图像 imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]); } }用到的相关函数:
创建干扰线条
//创建干扰线条(默认四条) for ($i=0; $i < 4; $i++) { $color = imagecolorallocate($this->使用随机生成的数值,对颜色进行设定,其中,RGB值分别为:img,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155),确保色调偏向浅色。 向图像中绘制一条线,起点坐标为随机生成的宽度和高度范围内,终点坐标同样为随机生成的宽度和高度范围内,线段颜色由指定参数决定。 } }用到的相关函数:
创建干扰点
//创建干扰点 (默认一百个点) public function createPiex(){ for ($i=0; $i < 100; $i++) { $color = imagecolorallocate($this->执行img函数,参数分别为从0到255中随机生成的三个整数,逗号分隔。 此操作将在当前图像对象中随机指定一个位置,并使用指定的颜色填充该点,具体位置由随机生成的横坐标和纵坐标决定,横坐标范围从0到图像宽度,纵坐标范围从0到图像高度。 } }使用的相关函数:
对外输出图像:
public function show() { $this->createImage(); $this->createCode(); 若此处的行标记被激活,则表示将生成干扰线。 $this->createLines(); } 若启用了该功能,则进行干扰点的创建操作。 $this->createPiex(); } 设置HTTP头部信息为指示内容类型为PNG图像格式;请求显示的页面内容应为PNG格式的图片。 将图像以PNG格式进行输出,使用imagepng函数处理。 销毁图像资源,并释放所占用的内存空间,执行imagedestroy($this->img)操作。 }用到的相关函数:
对外提供验证码:
public function getCode(){ return $this->code; } 完整代码如下: 字符串变量定义为qwertyupmkjnhbgvfcdsxa123456789。 $this->codeNum = $codeNum; $this->height = $height; $this->width = $width; $this->lineFlag = $lineFlag; $this->piexFlag = $piexFlag; $this->font = dirname(__FILE__).'/fonts/consola.ttf'; $this->fontSize = $fontSize; } public方法createImage执行时,将生成一张图像。 此操作将创建一个图像资源,其尺寸为宽度为 $this->width,高度为 $this->height;$this->img 变量将被赋予该图像资源。 此操作中,我们使用imagecolorallocate函数为图像分配颜色,所选颜色由三个随机生成的数值决定,这三个数值分别位于0到100的范围内。 } public function createCode(){ $strlen = strlen($this->string)-1; for ($i=0; $i < $this->codeNum; $i++) { 此代码段将随机选取字符串数组中的一个元素,并将其追加到当前代码的变量“code”中。 } 将代码信息存储于会话变量中,具体操作是将实例的code属性值赋值给$_SESSION数组中的code键。 $diff = $this->width/$this->codeNum; for ($i=0; $i < $this->codeNum; $i++) { 为图像分配随机颜色,该颜色由三个随机值组成,每个值介于100到255之间,分别对应红色、绿色和蓝色通道。 imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]); } } public方法 createLines负责生成线条 for ($i=0; $i < 4; $i++) { $color = imagecolorallocate($this->执行img,使用mt_rand函数在0到155之间随机生成三个数值,分别对应mt_rand(0,155),mt_rand(0,155),mt_rand(0,155)。 imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color); } } public方法中定义了一个名为createPiexs的函数。 for ($i=0; $i < 100; $i++) { $color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); imagesetpixel($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),$color); } } public function show() { $this->createImage(); $this->createCode(); if ($this->lineFlag) { $this->createLines(); } if ($this->piexFlag) { $this->createPiexs(); } 发送响应头信息,指定内容类型为图片PNG格式。 imagepng($this->img); imagedestroy($this->img); } public function getCode(){ return $this->code; } }这就是验证码相关代码的全部内容。它看起来确实相当简单,但其中涉及了不少图像处理函数。对于这些函数,我已经提供了相应的链接和详细的使用说明。这些函数并不需要强行记忆,如果遇到不明白的地方,可以随时查阅 PHP 的官方文档,而且还有中文版的文档可供参考。
2.2 使用验证码
既然封装工作已经完成,那么便可以着手应用。为了便于操作,我们可以在该类之后直接调用此类。
session_start(); //开启session 创建了一个验证码对象$captcha,该对象基于验证码类(支持自定义参数)。 $captcha->show(); //调用输出三、前端展示
后端已成功设置好验证码,因此前端界面现在可以展示出来。请对 index.php 文件中的注册和登录表单部分进行验证码相关内容的调整。
Click to Switch
img标签中嵌入的代码赋予了点击功能,从而使得用户能够通过点击操作来更换验证码。
效果图:
四、完善
截至目前,我们的验证码功能模块已基本定型。经过这一阶段的学习,大家对面向对象编程的概念应该有了更深入的认识。同时,也对面向对象编程的思想有所体会。面向对象编程的三大核心特性包括封装、继承和多态。在本次开发中,我们主要运用了封装的概念。大家可以对验证码类进行进一步的优化和升级,设计出更加完善的类结构。该实验向我们揭示了PHP函数众多的事实,提醒我们不应死记硬背,而应多查阅官方文档。
扫一扫在手机端查看
- 上一篇:CSS文本下划线美化方案_下划线应该位于文本基线(baseline)下方
- 下一篇:Dreamware配置PHP+MySQL站点_用dreamware 软件写好php代码后怎么在浏览器里预览出内容?
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。



客服1