php验证码的制作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php验证码的制作相关的知识,希望对你有一定的参考价值。
1 <?php 2 class Vcode { 3 private $width; //宽 4 private $height; //高 5 private $num; //数量 6 private $code; //验证码 7 private $img; //图像的资源 8 function __construct($width=120, $height=30, $num=4) { 9 $this->width = $width; 10 $this->height = $height; 11 $this->num = $num; 12 $this->code = $this->createcode(); 13 } 14 //获取字符的验证码, 用于保存在服务器中 15 function getcode() { 16 return $this->code; 17 } 18 //输出图像 19 function outimg() { 20 //创建背景 (颜色, 大小, 边框) 21 $this->createback(); 22 //画字 (大小, 字体颜色) 23 $this->outstring(); 24 //干扰元素(点, 线条) 25 $this->setdisturbcolor(); 26 //输出图像 27 $this->printimg(); 28 } 29 //创建背景 30 private function createback() { 31 //创建资源 32 $this->img = imagecreatetruecolor($this->width, $this->height); 33 //设置随机的背景颜色 34 $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255)); 35 //设置背景填充 36 imagefill($this->img, 0, 0, $bgcolor); 37 //画边框 38 $bordercolor = imagecolorallocate($this->img, 0, 0, 0); 39 imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor); 40 } 41 42 //画字 43 private function outstring() { 44 for($i=0; $i<$this->num; $i++) { 45 $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128)); 46 $fontsize=rand(10,12); //字体大小 47 $x = 3+($this->width/$this->num)*$i; //水平位置 48 $y = rand(0, imagefontheight($fontsize)-3); 49 //画出每个字符 50 imagechar($this->img, $fontsize, $x, $y, $this->code{$i}, $color); 51 } 52 } 53 54 //设置干扰元素 55 private function setdisturbcolor() { 56 //加上点数 57 for($i=0; $i<100; $i++) { 58 $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255)); 59 //给验证码图片干扰点上色 60 imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color); 61 //用color颜色在x,y坐标上画一个点 62 } 63 64 //加线条 65 for($i=0; $i<5; $i++) { 66 $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255)); 67 //给验证码图片干扰弧线上色 68 imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color); 69 //画弧线 70 } 71 } 72 73 //输出图像 74 private function printimg() { 75 if (imagetypes() & IMG_GIF) { 76 header("Content-type: image/gif"); 77 imagegif($this->img); 78 } elseif (function_exists("imagejpeg")) { 79 header("Content-type: image/jpeg"); 80 imagejpeg($this->img); 81 } elseif (imagetypes() & IMG_PNG) { 82 header("Content-type: image/png"); 83 imagepng($this->img); 84 } else { 85 die("No image support in this PHP server"); 86 } 87 88 } 89 90 //生成验证码字符串 91 private function createcode() { 92 $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY"; 93 // 去掉容易混淆的字符0oil012 94 $code = ""; 95 for($i=0; $i < $this->num; $i++) { 96 $code .=$codes{rand(0, strlen($codes)-1)};//rand()函数返回code字符串中任意一个位置 97 } 98 return $code; 99 } 100 101 //用于自动销毁图像资源 102 function __destruct() { 103 imagedestroy($this->img); 104 } 105 106 } 107 ?>
生成验证码的效果如图所示,上面所示代码的文件名为vcode.class.php;我们在code.php文件中开启session,引用这个文件;
代码如下:
<?php //开启session session_start(); include "vcode.class.php"; //构造方法 $vcode = new Vcode(); //将验证码放到服务器自己的空间保存一份 $_SESSION[‘code‘] = $vcode->getcode(); //将验证码图片输出 $vcode->outimg();
表单测试代码如下
<?php session_start(); if(isset($_POST[‘dosubmit‘])) { if(strtoupper($_SESSION[‘code‘]) == strtoupper($_POST[‘code‘]) ) {//验证输入的验证码 echo "输入成功!<br>"; }else{ echo "输入不对!<br>"; } } ?> <body> <form action="reg.php" method="post"> username: <input type="text" name="username"> <br> password: <input type="password" name="password"> <br> code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code"> <img src="code.php" onclick="this.src=‘code.php‘" /> <br> <!-- 1、将在输入框中的字符,当keyup的时候自动将里面的字符转换成大写 2、点击图片是会切换验证码 --> <input type="submit" name="dosubmit" value="登 录"> <br> </form> </body>
以上是关于php验证码的制作的主要内容,如果未能解决你的问题,请参考以下文章