php之驗證碼小程式

来源:http://www.cnblogs.com/xnnhgz2016/archive/2016/12/12/6166379.html
-Advertisement-
Play Games

驗證碼功能(個人理解): 個人思路:在a-z,A-Z,1-9生成n位隨機的數來構成新的驗證碼。 關於生成驗證碼的幾個小函數 a) 如: range(1,9) a) array_merge(數組1,數組2….) a) 隨機從數組中取出幾個下標返回一個數組 生成驗證碼代碼 <?php $arr1=ran ...


驗證碼功能(個人理解):

  1. 減輕伺服器的壓力(如12306的驗證碼功能);
  2. 防止暴力註冊

個人思路:在a-z,A-Z,1-9生成n位隨機的數來構成新的驗證碼。

關於生成驗證碼的幾個小函數

  1. range() //指定範圍輸出一個數組

a)       如: range(1,9)

  1. array_merge()//合併數組

a)       array_merge(數組1,數組2….)

  1. array_rand(數組,數量)

a)       隨機從數組中取出幾個下標返回一個數組

  1. shuffle(數組)//將再一次打亂數組中元素
  2. mt_rand(指定一個範圍) //生成一個更好的隨機數
  3. 如: mt_rand(1,5) //生成一個在1-5之間的任意數

生成驗證碼代碼

<?php

              $arr1=range('a', 'z');//指定範圍輸出一個數組

              $arr2=range('A', 'Z');

              $arr3=range(1,9);

              $arr=array_merge($arr1,$arr2,$arr3); //合併數組

              $index = array_rand($arr,5); //在$arr中隨機取5個數,返回值是$arr的下標

Shuffle($index);

              $code = '';//定義一個空的字元串來存儲生成的驗證碼用’點’來進行拼接

              foreach ($index as $key => $value) {//遍曆數組

                     $code.= $arr[$value];//根據下標取數組中的值

              }

              var_dump($code);

        ?>

運行結果截圖

 

完善:要把驗證碼添加到圖像中這樣的驗證碼才逼真

在完善之前先介紹有關圖像創建的大致步驟

創建圖像

方法一: 創建一個真彩色圖像 (空畫布)

imagecreatetruecolor(width, height) //創建一個真彩色圖像

說明:

  1. width : 畫布的寬度(像素)
  2. height: 畫布的高度(像素)
  3. 返回值為圖像資源

 

 

註意:

 

為真彩色圖像: 填充顏色

imagefill(image, x, y, color) //為圖像資源填充顏色

說明:

  1. image //圖像資源
  2. x,y,填充的坐標點(註意:填充的與此點最接近的顏色)

color; //用什麼顏色來填充

為真彩色圖像: 分配顏色

imagecolorallocate(image, red, green, blue)

說明:

  1. image //圖像資源
  2. red: //紅顏色(0-255) 或 0x(00-ff) //即十六進位來表示 (0xff就是255)
  3. green//綠顏色(0-255)
  4. blue //藍顏色(0-255)

imagefill和imagecolorallocate的代碼演示

在沒有給畫布填充顏色時的效果

 

給畫布填充顏色時的效果和代碼

<?php

//創建圖像資源(空白畫布)預設顯示為黑色

$image = imagecreatetruecolor(300, 400);

//1.image //圖像資源

//2.red: //紅顏色(0-255) 或 0x(00-ff) //即十六進位來表示 (0xff就是255)

//3.green//綠顏色(0-255)

//4.blue //藍顏色(0-255)

$color = imagecolorallocate($image, 255, 0, 0);

//1.image //圖像資源

//2.x,y,填充的坐標點(註意:填充的與此點最接近的顏色)

//3.color; //用什麼顏色來填充

imagefill($image, 0, 0, $color);

//輸出圖像

header('content-type:image/jpeg');

imagejpeg($image);

//銷毀圖像資源

imagedestroy($image);

?>

結果截圖;

 

輸出圖像(以jpeg為例)

  1. 輸出圖像到瀏覽器

a)       header('content-type:image/jpeg'); //設置將圖像通過瀏覽來查看

b)      imagejpeg(圖像資源) 

  1. 按文件進行輸出圖像

a)       imagejpeg(圖像資源,’圖像路徑’,圖像的質量)    //質量取值0-100

b)      註意:

 

註意:只能jpeg格式才有質量這個參數.

銷毀圖像

imagedestroy($image); //銷毀圖像,釋放記憶體資源.

註意: 當前生成幾個圖像資源,就銷毀幾個.

 

驗證碼的整個代碼:

 

 

<?php

//實例:讓文本居於圖像的正中

//創建圖像資源(空白的畫布)

$image = imagecreatetruecolor(100, 50);

 

$color = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));

//為圖像資源填充顏色

imagefill($image, 0, 0, $color);

 

//繪製圖像

$font = 5;

//驗證碼的開始

$arr1 = range('a','z');

$arr3 = range('A','Z');

$arr2 = range(1,9);

//array_merge — 合併一個或多個數組

$arr = array_merge($arr1,$arr2,$arr3);

 

$index = array_rand($arr,5); //隨機從原數組中找出5個下標

$string = '';

foreach ($index as $value) { //$value 兩個功能,即是$index中的值,又是$arr中的下標

       $string .= $arr[$value];  //將得到字元進行連接

}

//驗證碼的結束

//mt_rand — 生成更好的隨機數

//echo mt_rand(1,5);die;

 

//加入點干擾

$pointcolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));

//迴圈創建1000個干擾點

for ($i=0; $i <1000 ; $i++) {

       imagesetpixel($image, mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)), $pointcolor);

}

 

//加入線的干擾

$lintecolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));

// 迴圈創建50個線干擾

for ($i=0; $i <50 ; $i++) {

       imageline($image, mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)), mt_rand(0,imagesx($image)), mt_rand(0,imagesy($image)) ,$lintecolor);

}

//一個字元的寬度  imagefontwidth($font)

//字元串的個數: strlen(字元串)

//一個字元的寬度*字元串的個數

//所有字元串寬度和= 一個字元的寬度*字元串的個數

//$x = (畫布的寬度-所有字元串寬度和)/2

$x = (imagesx($image)-imagefontwidth($font)*strlen($string))/2;

//$y = (畫布的高度-字元的高度)/2;

//字元的高度: imagefontheight($font)

$y = (imagesy($image)-imagefontheight($font))/2;

 

$stringcolor = imagecolorallocate($image, mt_rand(20,200), mt_rand(20,200), mt_rand(20,200));

 

imagestring($image, $font, $x, $y, $string, $stringcolor);

 

//輸出圖像

header('content-type:image/jpeg'); //設置將圖像通過瀏覽來查看

imagejpeg($image,'',100); //將圖像資源輸出

//銷毀圖像資源

imagedestroy($image); //銷毀圖像

 

 

理解代碼中的一些函數

 

加入干擾的點

imagesetpixel(image, x, y, color)

說明:x,y 一個點的坐標

 

 

加入干擾的線

imageline(image, x1, y1, x2, y2, color)

說明: x1,y1是線的一個端點坐標; x2,y2是線的另一個埠的坐標; 由兩點畫一條線

 

 

讓驗證碼居於圖像的正中

  1. imagefontheight(font)獲取字體的高度:
  2. imagefontwidth(font)獲取字體的寬度:
  3. strlen(字元串)//獲取字元串的長度
  4. imagesx(image) //獲取畫布的寬度
  5. imagesy(image) //獲取畫布的高度

 

 

最後運行結果

 

 

再次完善(和html代碼結合起來)

Html代碼

 

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

</head>

<body>

 

<form name='frm' method='post' action=''>

        <table width="30%" border="2" align="center" rules="all" cellpadding="10">

        <tr>

               <th colspan="2">請輸入信息</th>

        </tr>

        <tr>

               <th>姓名:</th>

               <th><input type="text" name="username"></input></th>

        </tr>

        <tr>

               <th>密碼:</th>

               <th><input type="password" name="userpwd"></input></th>

        </tr>

        <tr> 555556

               <th>驗證碼</th>

               <th><input type = 'text' name = 'checkcode'></input><img src="21.php" style="cursor:pointer" onclick="this.src='21.php'?+Math.random()"></th>

        </tr>

        <tr>

               <th colspan="2"><input type="submit" name="submit" value="提交"></input></th>

        </tr>

</table>

</form>

</body>

</html>

 

理解;

 

最後結果截圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • Aspose.Words簡單生成word文檔,C#獲取純文本 去除html標簽,C#獲取img src ...
  • 我Fork了QRCoder,並且相容了.Net Core,圖形庫用的是ZKWeb.System.Drawing Github: https://github.com/zkweb framework/QRCoder Nuget: https://www.nuget.org/packages/ZKWeb ...
  • 上一篇說了from in select的本質,具體參見你所不知道的linq。本篇說下from...in... from... in... select 首先上一段代碼,猜猜結果是什麼? 這段代碼的運行結果是什麼呢? 答案是,這段代碼會報錯,根本編譯不過~~~~~~那麼按照上一篇,我們對TestApp ...
  • 很多的軟體項目幾乎都包含著對文檔的操作,前面已經介紹過兩款操作文檔的組件,現在介紹一款文檔操作的組件NPOI。 NPOI可以生成沒有安裝在您的伺服器上的Microsoft Office套件的Excel報表,並且在後臺調用Microsoft Excel ActiveX更有效率;從Office文檔中提取 ...
  • 所有 ReSherper 的功能都可以使用快捷鍵。大部分功能都有預設快捷鍵,剩下的少數功能可以自定義快捷鍵。 ReSharper 提供了兩種快捷鍵的方式 Visual Studio:這種方式可以減少與 Visual Studio 本身快捷鍵的衝突。 ReSharper 2.0/IntelliJ ID ...
  • 一.昨天內容回顧 a) 主流瀏覽器 new XMLHttpRequest(); b) IE瀏覽器 new ActiveXObject(“Msxml2.XMLHTTP.6.0”); 屬性:responseText/responseXML readyState onreadystatechange 方法 ...
  • 線程通信: 如果線程A和線程B持有同一個MyObject類的對象object,這兩個線程會去調用不同的方法,但是它們是同步執行的,比如:線程B需要等待線程A執行完了methodA()方法之後,它才能執行methodB()方法。這樣,線程A和線程B就實現了 通信。 線程通信中要用到的方法:wait() ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...