php验证码

本文介绍如何使用PHP生成包含字母和数字的验证码图片,并将其保存到session中。文章详细展示了创建图片、绘制验证码字符、添加干扰线及干扰点的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考自Shuro's Blog(http://www.shuro.cn)

<?php
//指定本页面创建一张图片,即访问本页面返回一张图片
Header("Content-type:image/gif");
//重要:关闭本页面所有错误提示,若有提示则不能产生图片
ini_set('display_errors', 'Off');

/*
 * 初始化
 * border:外边框宽度
 * how:验证码位数
 * w:图片的宽度
 * h:图片的高度
 * fontsize:验证码每个字的大小
 * alpha:验证码中所有的字母组成的字符串
 * number:验证码中所有数字组成的字符串
 * randcode:保存验证码
 */
$border=1;
$how=4;
$w=$how*15;
$h=20;
$fontsize=5;
$alpha="abcdefghijkmnopqrstuvwxyz";
$number="0123456789";
$randcode="";
srand((double)microtime()*1000000);//???

//创建空白图片,并制定宽高
$im=imagecreate($w, $h);
//创建颜色并填充为背景
$bgcolor=imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bgcolor);

/*若有边宽则创建黑色边框
 * 步骤:a.制定当前图片的画笔颜色
 * 	   b.在图片上画黑边
 * 		(目标图片,左上角x,左上角y,右下角x,右下角y,颜色)
 */
if($border){
	$black=imagecolorallocate($im, 0, 0, 0);
	imagerectangle($im, 0, 0, $w-1, $h-1, $black);
}

//随机产生验证码并画到图片上
for($i=0;$i<$how;$i++){
	$alpha_or_number=mt_rand(0, 1);
	$str=$alpha_or_number?$alpha:$number;
	$witch=mt_rand(0, strlen($str)-1);
	$code=substr($str, $witch,1);
	$j=!$i?4:$j+15;
	$color3=imagecolorallocate($im, mt_rand(0,200), mt_rand(0,200), mt_rand(0,200));
	imagechar($im, $fontsize, $j, 3, $code, $color3);
	$randcode.=$code;
}

/*
 * 打开 sesion
 * 把验证码保存到session里
 */
session_start();
$_SESSION['randcode']=$randcode;

//绘背景干扰线
for($i=0; $i<5; $i++)
{
	$color1 = imagecolorallocate($im, mt_rand(0, 255),  mt_rand(0, 255),  mt_rand(0, 255));
	ImageArc($im,mt_rand(-5, $w),mt_rand(-5, $h),mt_rand(20, 200),mt_rand(20, 200),0,360,$color1);
}

//绘背景干扰点
for($i=0; $i<$how*40; $i++)
{
	$color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色
	ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点
}
//保存当前绘画
Imagegif($im);
//释放与绘画有关的资源
ImageDestroy($im);
?>

用<img src="本文件路径" onclick='this.src=this.src+"?"+Math.random()'/>语句把验证码添加到需要的地方

遇到的问题:

1.图片显示错误(红色叉叉):

    原因:命名错误导致使用了未命名的变量出现警告,所以图片不能显示,加上ini_set('display_errors', 'Off');屏蔽所有错误信息即可 正常显示。注:本页面为一张图片所以不可输出任何信息,不然图片无法显示

2.在其他页面无法访问session

    原因:在php.ini文件里配置的session路径未创建文件夹导致无法保存和读取session,创建文件夹即可

效果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值