Heim  >  Artikel  >  Backend-Entwicklung  >  Implementierung der Benutzerregistrierungs- und Anmeldefunktion auf Basis von PHP

Implementierung der Benutzerregistrierungs- und Anmeldefunktion auf Basis von PHP

高洛峰
高洛峰Original
2016-12-20 09:17:252028Durchsuche

In diesem Artikel wird die Realisierung der Benutzerregistrierungs- und Anmeldefunktion auf Basis von PHP vorgestellt. Dieses Projekt ist in vier Teile unterteilt: 1. Erstellung der Front-End-Seite, 2. Erstellung des Bestätigungscodes, 3. Implementierung der Registrierung und Anmeldung, 4. Funktionelle Verbesserung. Einzelheiten finden Sie weiter unten.

Verifizierungscode-Erstellung

1. Einführung in das Experiment

Dieses Experiment führt Sie dazu, objektorientiertes Denken zu verwenden, um einen Verifizierungscode zu kapseln Art. Und auf der Registrierungs- und Anmeldeoberfläche angezeigt. Durch das Studium dieses Experiments werden Sie die OOP-Ideen von PHP sowie die Verwendung der GD-Bibliothek und die Generierung von Verifizierungscode verstehen.

1.1 Beteiligte Wissenspunkte

PHP

GD-Bibliothek

OOP-Programmierung

1.2 Entwicklung Werkzeuge

sublime, ein praktischer und schneller Texteditor. Klicken Sie auf die untere linke Ecke des Desktops: Anwendungsmenü/Entwicklung/sublime

2. Kapselungsüberprüfungscodeklasse

2.1 Verzeichnisse erstellen und Schriftarten vorbereiten

Erstellen Sie unter dem Webverzeichnis ein Admin-Verzeichnis als unser Backend-Verzeichnis, um Backend-Codedateien zu speichern. Erstellen Sie unter „Admin“ ein Schriftartenverzeichnis, um die Schriftarten zu speichern, die für die Erstellung von Bestätigungscodes erforderlich sind.

Erstellen Sie unter Admin eine neue Captcha.php-Datei. Dies ist die Bestätigungscodedatei, die wir bearbeiten müssen.

Aktuelle Verzeichnishierarchie:

Implementierung der Benutzerregistrierungs- und Anmeldefunktion auf Basis von PHP

Captcha.php-Datei bearbeiten:

<?php
/**
* Captcha class
*/
class Captcha
{
   
  function __construct()
  {
    # code...
  }
}

Fügen Sie die privaten Eigenschaften und Konstruktionsmethoden dieser Klasse hinzu:

<?php
/**
* Captcha class
*/
class Captcha
{
  private $codeNum;  //验证码位数
  private $width;  //验证码图片宽度
  private $height;  //验证码图片高度
  private $img;  //图像资源句柄
  private $lineFlag;  //是否生成干扰线条
  private $piexFlag;  //是否生成干扰点
  private $fontSize;  //字体大小
  private $code;  //验证码字符
  private $string;  //生成验证码的字符集
  private $font;  //字体
  function __construct($codeNum = 4,$height = 50,$width = 150,$fontSize = 20,$lineFlag = true,$piexFlag = true)
  {
    $this->string = &#39;qwertyupmkjnhbgvfcdsxa123456789&#39;;  //去除一些相近的字符
    $this->codeNum = $codeNum;
    $this->height = $height;
    $this->width = $width;
    $this->lineFlag = $lineFlag;
    $this->piexFlag = $piexFlag;
    $this->font = dirname(__FILE__).&#39;/fonts/consola.ttf&#39;;
    $this->fontSize = $fontSize;
  }
}

Schriftdateien können mit dem folgenden Befehl in das Schriftartenverzeichnis heruntergeladen werden :

$ wget http://labfile.oss.aliyuncs.com/courses/587/consola.ttf

Als nächstes beginnen Sie mit dem Schreiben der spezifischen Methode:

Bild erstellen Ressourcenhandle

//创建图像资源 
public function createImage(){
    $this->img = imagecreate($this->width, $this->height);  //创建图像资源
    imagecolorallocate($this->img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));  //填充图像背景(使用浅色)
  }

Verwendete verwandte Funktionen

imagecreate: Erstellen Sie ein neues palettenbasiertes Bild

imagecolorallocate: Einem Bild eine Farbe zuweisen

mt_rand: Bessere Zufallszahlen generieren

Verifizierungscode-Zeichenfolge erstellen und an das Bild ausgeben

//创建验证码 
public function createCode(){
    $strlen = strlen($this->string)-1;
    for ($i=0; $i < $this->codeNum; $i++) {
      $this->code .= $this->string[mt_rand(0,$strlen)];  //从字符集中随机取出四个字符拼接
    }
     $_SESSION[&#39;code&#39;] = $this->code;  //加入 session 中
   
   //计算每个字符间距
    $diff = $this->width/$this->codeNum;
    for ($i=0; $i < $this->codeNum; $i++) {
          //为每个字符生成颜色(使用深色)
     $txtColor = imagecolorallocate($this->img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
     //写入图像
      imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]);
    }
  }

Verwandte Funktionen

imagecreate: Ein neues palettenbasiertes Bild erstellen

imagecolorallocate: Einem Bild eine Farbe zuweisen

mt_rand: Besser generieren Zufallszahlen

Bestätigungscode-Zeichenfolge erstellen und als Bild ausgeben

//创建验证码 
public function createCode(){
    $strlen = strlen($this->string)-1;
    for ($i=0; $i < $this->codeNum; $i++) {
      $this->code .= $this->string[mt_rand(0,$strlen)];  //从字符集中随机取出四个字符拼接
    }
     $_SESSION[&#39;code&#39;] = $this->code;  //加入 session 中
   
   //计算每个字符间距
    $diff = $this->width/$this->codeNum;
    for ($i=0; $i < $this->codeNum; $i++) {
          //为每个字符生成颜色(使用深色)
     $txtColor = imagecolorallocate($this->img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
     //写入图像
      imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]);
    }
  }

Verwandte verwendete Funktionen:

imagettftext: Verwenden TrueType-Schriftarten zum Schreiben von Text in Bilder

Interferenzlinien erstellen

//创建干扰线条(默认四条)
public function createLines(){
    for ($i=0; $i < 4; $i++) {
      $color = imagecolorallocate($this->img,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));  //使用浅色
      imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
  }

Verwandte verwendete Funktionen:

Bildlinie: Zeichnen ein Liniensegment

Interferenzpunkte erstellen

//创建干扰点 (默认一百个点)
public function createPiex(){
    for ($i=0; $i < 100; $i++) {
      $color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
      imagesetpixel($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
  }

Verwandte Funktionen:

imagesetpixel: Ein einzelnes Pixel zeichnen

Bild ausgeben:

public function show()
 {
   $this->createImage();
   $this->createCode();
   if ($this->lineFlag) {  //是否创建干扰线条
     $this->createLines();
   }
   if ($this->piexFlag) {  //是否创建干扰点
     $this->createPiex();
   }
   header(&#39;Content-type:image/png&#39;);  //请求页面的内容是png格式的图像
   imagepng($this->img);  //以png格式输出图像
   imagedestroy($this->img);  //清除图像资源,释放内存
 }

Verwandte Funktionen:

imagepng: Das Bild an den Browser ausgeben oder Datei im PNG-Format

imagedestroy: Zerstöre ein Bild

Geben Sie einen externen Bestätigungscode an:

public function getCode(){
    return $this->code;
  }

Vollständig Der Code lautet wie folgt:

string = 'qwertyupmkjnhbgvfcdsxa123456789';
    $this->codeNum = $codeNum;
    $this->height = $height;
    $this->width = $width;
    $this->lineFlag = $lineFlag;
    $this->piexFlag = $piexFlag;
    $this->font = dirname(__FILE__).'/fonts/consola.ttf';
    $this->fontSize = $fontSize;
  }
 
  public function createImage(){
    $this->img = imagecreate($this->width, $this->height);
    imagecolorallocate($this->img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
  }
 
  public function createCode(){
    $strlen = strlen($this->string)-1;
    for ($i=0; $i < $this->codeNum; $i++) {
      $this->code .= $this->string[mt_rand(0,$strlen)];
    }
    $_SESSION['code'] = $this->code;
    $diff = $this->width/$this->codeNum;
    for ($i=0; $i < $this->codeNum; $i++) {
      $txtColor = imagecolorallocate($this->img,mt_rand(100,255),mt_rand(100,255),mt_rand(100,255));
      imagettftext($this->img, $this->fontSize, mt_rand(-30,30), $diff*$i+mt_rand(3,8), mt_rand(20,$this->height-10), $txtColor, $this->font, $this->code[$i]);
    }
  }
 
  public function createLines(){
    for ($i=0; $i < 4; $i++) {
      $color = imagecolorallocate($this->img,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
      imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
  }
 
  public function createPiexs(){
    for ($i=0; $i < 100; $i++) {
      $color = imagecolorallocate($this->img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
      imagesetpixel($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
    }
  }
 
  public function show()
  {
    $this->createImage();
    $this->createCode();
    if ($this->lineFlag) {
      $this->createLines();
    }
    if ($this->piexFlag) {
      $this->createPiexs();
    }
    header('Content-type:image/png');
    imagepng($this->img);
    imagedestroy($this->img);
  }
 
  public function getCode(){
    return $this->code;
  }
}

Das Obige ist der gesamte Code der Verifizierungscodeklasse. Es scheint recht einfach zu sein, aber es nutzt viele Bildverarbeitungsfunktionen. Ich habe auch die notwendigen Links und Nutzungsanweisungen für die oben genannten verwandten Funktionen erstellt. Es besteht keine Notwendigkeit, sich diese Funktionen auswendig zu lernen. Wenn Sie auf etwas Unklares stoßen, lesen Sie bitte jederzeit die offizielle PHP-Dokumentation. Das Wichtigste ist, dass es eine chinesische Dokumentation gibt.

2.2 Verwendung des Bestätigungscodes

Nachdem es verpackt wurde, können Sie mit der Verwendung beginnen. Der Einfachheit halber rufen Sie diese Klasse hier direkt unter der Captcha-Klasse auf:

session_start(); //开启session
$captcha = new Captcha();  //实例化验证码类(可自定义参数)
$captcha->show();  //调用输出

3. Front-End-Anzeige

Zurück -end Der Bestätigungscode wurde vorbereitet und die Front-End-Schnittstelle kann den Bestätigungscode-Teil des Registrierungs- und Anmeldeformulars in index.php anzeigen:

<div class="form-group">
 <div class="col-sm-12">
   <img src="admin/Captcha.php" alt="" id="codeimg" onclick="javascript:this.src = &#39;admin/Captcha.php?&#39;+Math.random();">
   <span>Click to Switch</span>
 </div>
</div>

Der js-Code des Klickereignisses wird dem img-Tag hinzugefügt, sodass die Funktion des Klickens zum Ändern des Bestätigungscodes realisiert werden kann!

Rendering:

Implementierung der Benutzerregistrierungs- und Anmeldefunktion auf Basis von PHP

4. Verbesserung

Bisher ist unser Verifizierungscodemodul im Grunde fertig. Nach dem Studium hier sollte jeder ein besseres Verständnis für objektorientierte Programmierung haben. Ich bemerkte auch einen Hauch von OOP-Denken. Die drei Hauptmerkmale von OOP: Kapselung, Vererbung und Polymorphismus. Wir verwenden hier nur einen kleinen Teil des Gedankens der Kapselung. Sie können diese Verifizierungscodeklasse weiter verfeinern und verbessern und eine perfektere Klasse entwerfen. Dieses Experiment zeigt uns auch, dass PHP viele Funktionen hat, also merken Sie sich diese nicht auswendig und lesen Sie mehr offizielle Dokumente.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn