自己过去自学了PHP绘画验证码的教程,现在就把这一部分笔记跟大家分享,希望可以帮到大家。

顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻烦了。

 笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2

下面主要从理论+实践代码进行讲解,后面有代码实例。

一、验证码的介绍
验证码是为全自动区分计算机和人类的图灵测试的缩写。是一种区分用户是计算机和人的公共全自动程序。

二、验证码应用场景?
(都是为了区分人还是机器,屏蔽机器请求)
a)登录、注册确定提交前,做人/机器校验;
b)发布、回复信息前,做人/机器校验;
c)疑似机器请求时,做人/机器校验;
………………

 

三、验证码服务的核心技术分析
实现步骤:
  1.生成底图;
  2.生成验证内容;
  3.生成验证码图片;
  4.校验验证内容;

技术点:
  a)底图的实现,并且添加干扰元素;
    依赖PHP图片处理库GD
    http://php.net/gd
  b)生成验证内容
    简单的随机数生成,使用PHP函数mt_rand();
    随机数字+字母生成,需要ASCII码理论基础;
    随机中文生成,需要UTF-8编码理论基础;
  c)验证内容保存在服务端;
    需要PHP操作SESSION基础
  d)验证内容的校验
    需要前端Ajax基础;

注意事项:
  a)依赖GD扩展
  b)输出图片前,必须提前输出图片header信息;
  c)该方法默认输出为黑色背景

从理论部分,然后按步骤进行一步一步的写下面的代码:

验证码的实例:(基本的验证码

<?php
session_start();
// 先制作底图
$image = imagecreatetruecolor(100, 30);
$bgcolor = imagecolorallocate($image, 255, 255, 255);//生成底片颜色,默认为黑色
imagefill($image, 0, 0, $bgcolor);//x,y轴上的位置 /*// 在地图上显示随机数字
for($i=0;$i<4;$i++){
$fontsize=6;
$fontcolor = imagecolorallocate($image, rand(0,120), rand(0,120), rand(0,120));
$fontcontent=rand(0,9);//数字0~9 // 关键的部分 (注意事项:控制好字体大小与分布,避免字体重叠或显示不全)
$x=($i*100/4)+rand(5,10); //写在的坐标上
$y=rand(5,10); imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
*/
/* //数字和字母验证码
for($i=0;$i<4;$i++){
$fontsize=6;
$fontcolor=imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120));
$data ='abcdefghigkmnpqrstuvwxy3456789';
$fontcontent=substr($data, rand(0,strlen($data)),1); $x=($i*100/4+rand(5,10));
$y=rand(5,10);
imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}*/ $captch_code="";
//字母验证码
for($i=0;$i<4;$i++){
$fontsize=6;
$fontcolor=imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120));
$data ='abcdefghigkmnpqrstuvwxy';
$fontcontent=substr($data, rand(0,strlen($data)),1);
$captch_code.=$fontcontent; $x=($i*100/4+rand(5,10));
$y=rand(5,10);
imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
$_SESSION['authcode']=$captch_code; // 添加点的干扰素
for($i=0;$i<200;$i++){
$pointcolor = imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200));
imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
} // 添加线干扰
for($i=0;$i<3;$i++){
$linecolor=imagecolorallocate($image, rand(80,220), rand(80,220),rand(80,220));
imageline($image, rand(1,99),rand(1,29), rand(1,99),rand(1,29),$linecolor);
} header('content-type:image/png');//输出png的图片
imagepng($image);//生成图片 // 销毁图片
imagedestroy($image); ?>

  

关于PHP的验证代码部分后,就是配上前端的显示页面代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body> <form action="reg.php" method="post">
<img id="captcha_img" src="verify.php?r=<?php echo rand();?>">
<a href="javascript:void(0);" onclick="document.getElementById('captcha_img').src='verify.php?+Math.random()';" title="换一个?">看不清?</a><br>
验证码:<input type="text" name="authcode">
<input type="submit" >
</form>
</body>
</html>

 上面是数字的验证码,下面的这部分PHP是图片验证码的页面图片验证码的显示

<?php

	session_start();

// 图片的验证码
$table=array(
"pic0"=>'狗',
"pic1"=>'猫',
"pic2"=>'鱼',
"pic3"=>'鸟'
); $index=rand(0,3); $value=$table['pic'.$index];
$_SESSION['authcode']=$value; $filename=dirname(__FILE__).'\\pic'.$index.'.jpg';//需要自己准备好图片!!
$contents=file_get_contents($filename); header('content-type:image/jpg'); echo $contents; ?>

 

下面这个是汉字的显示代码:

汉字的验证码:
<?php
session_start();
// 先制作底图
$image = imagecreatetruecolor(200, 60);
$bgcolor = imagecolorallocate($image, 255, 255, 255);//生成底片颜色,默认为黑色
imagefill($image, 0, 0, $bgcolor);//x,y轴上的位置 $fontface='msyh.ttf';
$str="刘恒春美女帅哥看这里来好样的我知道了是"; $strdb=str_split($str,3);//每三个长算一个汉字
header("content-type:text/html;charset='utf8'");
$captch_code="";
//中文验证码
for($i=0;$i<4;$i++){
$fontcolor=imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); $index=rand(0,count($strdb));
$cn=$strdb[$index];
$captch_code.=$cn; imagettftext($image, mt_rand(20,24), mt_rand(-60,60), (40*$i+20), mt_rand(30,35),$fontcolor,$fontface,$cn);
}
$_SESSION['authcode']=$captch_code; // 添加点的干扰素
for($i=0;$i<200;$i++){
$pointcolor = imagecolorallocate($image, rand(50,200), rand(50,200), rand(50,200));
imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor);
} // 添加线干扰
for($i=0;$i<3;$i++){
$linecolor=imagecolorallocate($image, rand(80,220), rand(80,220),rand(80,220));
imageline($image, rand(1,199),rand(1,59), rand(1,199),rand(1,59),$linecolor);
} header('content-type:image/png');//输出png的图片
imagepng($image);//生成图片 // 销毁图片
imagedestroy($image); ?>

  

综上的全部就是验证码代码的总结了,如果有需要可以到我下面的百度云里面下载对应的笔记。

笔记链接:http://pan.baidu.com/s/1qYdQdKK 密码:pvj2

PHP验证码的制作教程的更多相关文章

  1. Dash文档制作教程

    前言 什么是Dash 面向程序员的文档库(Mac) 代码片段管理工具 这是强烈推荐给每天在各种API文档中摸爬滚打的程序员们的神器. 为什么要自己制作文档 官方的源中没有相关文档 文档在离线下体验更好 ...

  2. 24个 HTML5 & CSS3 下拉菜单效果及制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...

  3. 10个优秀的 HTML5 & CSS3 下拉菜单制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...

  4. 10个实用的 CSS3 按钮效果制作教程

    人们往往喜欢那些有更多互动元素的网站,因此现在很多设计师专注于他们的 CSS3 技能.这是因为 CSS3 技能可以帮助他们在很大的程度上实现所需的吸引力.这里分享的10个优秀的 CSS3 按钮效果制作 ...

  5. 20个漂亮 CSS3 按钮效果及优秀的制作教程

    在这篇文章中,我们编译了一组有用的 CSS3 动画按钮教程和引人注目的实验.正如我们都知道的,CSS3在网页设计方面是最重要和最关键的,可以使您的网站对访客更具吸引力和互动性.你可以学习这些教程和试验 ...

  6. PPT制作教程:如何制作ppt

    PowerPoint(PPT)是专门用于制作演示文稿(俗称幻灯片).广泛运用于各种会议.产品演示.学校教学等.学会如何制作ppt,成为提升工作效 率的好帮手.PPT包含有很多的功能,我们可以根据个人喜 ...

  7. WordPress主题制作教程5:循环

    wordpress循环分两种,一种是自定义循环,一种是默认循环. 自定义循环:根据指定参数进行实例化 调用所有页面,post_type值:page对应页面,post对应文章 <?php $arg ...

  8. 11个优秀的HTML5 & CSS3下拉菜单制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用HTML5和CSS3可以更容易创造视觉 ...

  9. WordPress插件制作教程(八): 最后总结

    WordPress插件教程最后一篇,还是为大家简单的做下总结.这次插件制作教程讲的内容和知识点个人觉得不是很多,因为插件制作不单单是这些内容,它涉及的知识很多很多,不是说你会一些函数就可以做出一个好的 ...

随机推荐

  1. Python、PyCharm的安装及使用方法(Mac版)

    上周跟朋友喝咖啡时聊起我想学Python,她恰好也有这个打算,顺便推荐了一本书<编程小白的第1本Python入门书>,我推送到Kindle后,随手翻看了下,用语平实,简洁易懂. 之前在R语 ...

  2. session知识总结

    0.什么是会话? - 简单理解:打开浏览器到关闭浏览器过程中的操作.请求. 1.Session是什么? - session是HttpSession的简称: - 用于保存会话状态: - 将会话状态保存在 ...

  3. js事件触发(一)

    今日和一位前端童鞋聊了下js触发事件的两种形式: 第一种在jsp/vm上做类似onClick=functionName()的触发:另一种是在js文件中增加对应节点的监听事件触发.前者页面掺杂了js的内 ...

  4. word vbs脚本 设置所有题注样式为蓝色,下划线

    Attribute VB_Name = "题注样式" Sub SetCorssRef() 'Word版,设置所有交叉引用的文本的格式 Dim aField As Word.Fiel ...

  5. Unite'17 Shanghai再一次问候

    Unite'17 Shanghai再一次问候 --暨Unity2017年度大会 2017年5月11日,主题为"再一次问候"的Unity年度盛会在上海国际会议中心举行,这是Unity ...

  6. 每天一道Java题[5]

    题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: ...

  7. 来自一位工作一年多的猿的分享 ------- ioc

    这是我第一次写东西记录吧:还记得小学老师教的写文章要有"开篇 起伏 高潮...高潮 结束",反正我不会用上: 最近在研究IOC这玩意:百度了很多关于这方面的帖子:关于IOC和DI的 ...

  8. qt添加资源文件方法

    File->new file->file and classes->Qt->qt resources->   add name   add->add prefix- ...

  9. javaWeb学习总结(8)- JSP中的九个内置对象(4)

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  10. 开涛spring3(9.1) - Spring的事务 之 9.1 数据库事务概述

    9.1  数据库事务概述 事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务. 事务必需满足ACID(原子性.一致性.隔离性和持久性 ...