用PHP生成验证码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用PHP生成验证码相关的知识,希望对你有一定的参考价值。
初学web,正在尝试写一个博客,注册的时候需要用的验证码。我所学的书Head First中有关于验证码的代码,改了下中文注释,先贴上
<?php session_start(); //定义重要的常量 define(‘CAPTCHA_NUMCHARS‘,6); define(‘CAPTCHA_WIDTH‘,100); define(‘CAPTCHA_HEIGHT‘,25); //生成短语 $pass_phrase=""; for($i=0;$i<CAPTCHA_NUMCHARS;$i++) { $pass_phrase.=chr(mt_rand(97,122)); } //存储在会话中 $_SESSION[‘pass_phrase‘]=sha1($pass_phrase); //创建图像 $img=imagecreatetruecolor(CAPTCHA_WIDTH,CAPTCHA_HEIGHT); //设置白色背景黑色文本灰色图案 $bg_color=imagecolorallocate($img,255,255,255); $text_color=imagecolorallocate($img,0,0,0); $graphic_color=imagecolorallocate($img,64,64,64); //填充背景 imagefilledrectangle($img,0,0,CAPTCHA_WIDTH,CAPTCHA_HEIGHT,$bg_color); //画一些随机的线 for($i=0;$i<3;$i++) { imageline($img,0,rand()%CAPTCHA_HEIGHT,CAPTCHA_WIDTH,rand()%CAPTCHA_HEIGHT,$graphic_color); } //画一些随机的点 for($i=0;$i<50;$i++) { imagesetpixel($img,rand()%CAPTCHA_WIDTH,rand()%CAPTCHA_HEIGHT,$graphic_color); } //绘制短语 imagettftext($img,18,0,5,CAPTCHA_HEIGHT-5,$text_color,"Courier New Bold.ttf",$pass_phrase); //生成PNG图象 header("Content-type:image/png"); imagepng($img); //清除缓存 imagedestroy($img); ?>
基本思路就是用GD库创建一个图象,然后随机画一些线条、点和字符。函数的用法都可以查到,这里不再赘述,说一下我遇到的问题。
1.打开上面的网页之后浏览器显示图片未能正确加载,百度提供了一个解决方法,就是在header()函数前加上ob_clean()函数,清除缓存,然后就成功打开了。
2.打开之后图片上没有验证码,怀疑是imagettftext()函数的问题,但是并没有解决,在网上搜索时找到别人关于验证码的代码,将imagettftext()函数换成imagestring(),于是显示成功了。
这里再贴一下别人的代码,效果比书上的好,贴在百度知道上的提问,应该不会说我侵权吧= =
<?php session_start(); //创建随机码 for($i=0;$i<4;$i++){ $_nmsg .= dechex(mt_rand(0, 15)); } //保存在session里 $_SESSION[‘code‘] = $_nmsg; //长和高 $_width = 75; $_height = 25; //创建图像 $_img = imagecreatetruecolor($_width, $_height); $_white = imagecolorallocate($_img, 255, 255, 255); imagefill($_img, 0, 0, $_white); //创建黑色边框 $_black = imagecolorallocate($_img, 100, 100, 100); imagerectangle($_img, 0, 0, $_width-1, $_height-1, $_black); //随机划线条 for ($i=0;$i<6;$i++) { $_rnd_color= imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255) ,mt_rand(0,255)); imageline($_img,mt_rand(0,75),mt_rand(0,25),mt_rand(0,75),mt_rand(0,25) ,$_rnd_color); } //随机打雪花 for ($i=1;$i<100;$i++) { imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),"*", imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))); } //输出验证码 for ($i=0;$i<strlen($_SESSION[‘code‘]);$i++){ imagestring($_img,mt_rand(3,5),$i*$_width/4+mt_rand(1,10), mt_rand(1,$_height/2),$_SESSION[‘code‘][$i], imagecolorallocate($_img,mt_rand(0,150),mt_rand(0,100),mt_rand(0,150))); } //输出图像 ob_clean(); header(‘Content-Type:image/png‘); imagepng($_img); //销毁 imagedestroy($_img); ?>
以上是关于用PHP生成验证码的主要内容,如果未能解决你的问题,请参考以下文章