用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生成验证码的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp生成的验证码不显示问题解决

用PHP生成验证码

thinkphp验证码不显示

PHP实现随机生成验证码功能

PHP生成验证码

php学习笔记:利用gd库生成图片,并实现随机验证码