Maison > développement back-end > tutoriel php > Classe de code de vérification PHP Analyse ValidateCode

Classe de code de vérification PHP Analyse ValidateCode

墨辰丷
Libérer: 2023-03-28 08:52:02
original
1751 Les gens l'ont consulté

Cet article analyse principalement en détail la classe de code de vérification PHP ValidateCode, qui a une certaine valeur de référence. Les amis intéressés peuvent se référer à

Classe de code de vérification d'analyse PHP

1.

J'ai vu ValidateCode écrit en PHP pour générer une classe de code de vérification sur Internet Ça fait du bien, donc je vais l'utiliser pour analyser et apprendre.

2. Diagramme de classe

3. Code de vérification du code de pièce de classe

3.1 Définir des variables

  //随机因子
  private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789';
  private $code;
  private $codeLen = 4;

  private $width = 130;
  private $heigh = 50;
  private $img;//图像

  private $font;//字体
  private $fontsize = 20;
Copier après la connexion

$charset est un facteur aléatoire. Il n'est pas facile de supprimer un. peu ici. Caractères distinctifs, tels que les lettres "i, l, o, q" et les chiffres "0,1". Si nécessaire, vous pouvez ajouter des caractères chinois ou autres ou des calculs, etc.

$codeLen indique la longueur du code de vérification, généralement 4 chiffres.

3.2 Constructeur, définissez la police du code de vérification, générez une image en vraies couleurs img

public function __construct()
  {
    $this->font = ROOT_PATH.'/font/Chowderhead.ttf';
    $this->img = imagecreatetruecolor($this->width, $this->heigh);
  }
Copier après la connexion

3.3 Sélectionnez au hasard 4 caractères du facteur aléatoire comme code de vérification $code.

//生成随机码
  private function createCode()
  {
    $_len = strlen($this->charset) - 1;
    for ($i = 0; $i < $this->codeLen; $i++) {
      $this->code .= $this->charset[mt_rand(0, $_len)];
    }
  }
Copier après la connexion

3.4 Générer la couleur d'arrière-plan du code de vérification.

//生成背景
  private function createBg()
  {
$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

  }
Copier après la connexion

où mt_rand(157, 255) , le but est de sélectionner au hasard une couleur plus claire.

3.5 Générer du texte sur l'image.

//生成文字
  private function createFont()
  {
    $_x = $this->width / $this->codeLen;
    $_y = $this->heigh / 2;
    for ($i = 0; $i < $this->codeLen; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
    }
  }
Copier après la connexion

Générer sur l'image Code de vérification text considère principalement la position du texte sur l’image et la couleur de chaque texte.

Contrôlez la position sur l'axe des x du nième texte = (largeur de l'image/longueur du code de vérification) * (n-1) + numéro de décalage aléatoire ; où n = {d1....n}<🎜 >

Contrôlez la position de l'axe Y du nième texte = hauteur de l'image/2 + numéro de décalage aléatoire ;

mt_rand(0, 156) sélectionne aléatoirement la couleur du texte, 0-156 est destiné à être une couleur plus foncée .

mt_rand(-30, 30) Rotation aléatoire du texte.

3.6 Générer des lignes et des flocons de neige sur l'image

//生成线条,雪花
  private function createLine()
  {
    for ($i = 0; $i < 15; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
    }
    for ($i = 0; $i < 150; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), &#39;#&#39;, $color);
    }
  }
Copier après la connexion

Dessiner des lignes Quand lorsque vous dessinez des flocons de neige, choisissez une valeur de couleur plus foncée et lorsque vous dessinez des flocons de neige, choisissez une valeur de couleur plus claire. Le but n'est pas d'affecter autant que possible la reconnaissance du code de vérification par l'œil humain, mais également d'interférer avec le mécanisme de reconnaissance automatique du code.

3.7 Générer des images de code de vérification pour les appels externes.

//对外生成
  public function doImg()
  {

    $this->createBg();   //1.创建验证码背景
    $this->createCode();  //2.生成随机码
    $this->createLine();  //3.生成线条和雪花
    $this->createFont();  //4.生成文字
    $this->outPut();    //5.输出验证码图像
  }
Copier après la connexion

3.8 Code complet :

img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
    imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);

  }

  //生成文字
  private function createFont()
  {
    $_x = $this->width / $this->codeLen;
    $_y = $this->heigh / 2;
    for ($i = 0; $i < $this->codeLen; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);
    }
  }

  //生成线条,雪花
  private function createLine()
  {
    for ($i = 0; $i < 15; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
      imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);
    }
    for ($i = 0; $i < 150; $i++) {
      $color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
      imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), &#39;#&#39;, $color);
    }
  }

  //输出图像
  private function outPut()
  {
    header('Content-Type: image/png');
    imagepng($this->img);
    imagedestroy($this->img);
  }

  //对外生成
  public function doImg()
  {

    $this->createBg();   //1.创建验证码背景
    $this->createCode();  //2.生成随机码
    $this->createLine();  //3.生成线条和雪花
    $this->createFont();  //4.生成文字
    $this->outPut();    //5.输出验证码图像
  }

  //获取验证码
  public function getCode()
  {
    return strtolower($this->code);
  }

}
Copier après la connexion

4. Test

Code du test :

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午1:20
 */

define(&#39;ROOT_PATH&#39;, dirname(__FILE__));
require_once ROOT_PATH.&#39;/includes/ValidateCode.class.php&#39;;

$_vc=new ValidateCode();
echo $_vc->doImg();
Copier après la connexion

Générer le code de vérification :

5. Appliquer

 <label>
<img src="../config/code.php" onclick="javascript:this.src=&#39;../config/code.php?tm=&#39;+Math.random();" />
</label>
Copier après la connexion

Le code onclick ci-dessus consiste à cliquer sur l'image du code de vérification, ce qui peut actualiser automatiquement le code de vérification.

code.php :

<?php
/**
 * Created by PhpStorm.
 * User: andy
 * Date: 16-12-22
 * Time: 下午3:43
 */
require substr(dirname(__FILE__),0,-7).&#39;/init.inc.php&#39;;

$_vc=new ValidateCode();
echo $_vc->doImg();
$_SESSION[&#39;ValidateCode&#39;]=$_vc->getCode();
Copier après la connexion

Le code complet de l'application peut être téléchargé depuis https://git.oschina.net /andywww/ Téléchargez-le depuis le fichier CMS1.0 de myTest.

6. Résumé

Au cours du processus de test indépendant, aucun problème n'a été détecté, mais lorsqu'il a été appliqué au projet, il a été initialement découvert que le code de vérification ; l'image n'a pas pu être générée. J'ai cherché en ligne et certains ont dit qu'elle se trouvait dans la fonction outPut()

In header('Content-Type: image/png'); devant cette ligne de code, qui peut être résolu. Problème de code de vérification. Bien que cette méthode soit simple, elle peut entraîner d'autres problèmes avec les données mises en mémoire tampon, car la fonction db_clean() ignore le contenu du tampon de sortie.

Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.


Recommandations associées :

Image générée par PHPCode de vérificationExplication détaillée de la fonction

php implémente le site Web Code de vérificationfonction

php encapsulé Code de vérificationexplication détaillée de la classe

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal