再介紹thinkphp3.2驗證碼的使用方法之前,先為大家詳細介紹ThinkPHP 驗證碼,具體內容如下
ThinkPHP 內置了驗證碼的支持,可以直接使用。要使用驗證碼,需要導入擴展類庫中的 ORG.Util.Image 類庫和 ORG.Util.String 類庫。
驗證碼方法
我們通過在在模塊類中增加一個 verify 方法來用于顯示驗證碼,最簡單的例子:
1
2
3
4
5
|
Public function verify(){ // 導入Image類庫 import( "ORG.Util.Image" ); Image::buildImageVerify(); } |
import 方法是 ThinkPHP 內置的類庫和文件導入方法,上例導入的文件為 ThinkPHP 系統目錄下 Lib/ORG/Util/Image.class.php 文件。如果已經將 Image 類庫拷貝到了當前項目下,如 Lib/ORG 下,則可以以:
1
|
import( "@.Util.Image" ); |
import 方法是 ThinkPHP 內置的類庫和文件導入方法,上例導入的文件為 ThinkPHP 系統目錄下 Lib/ORG/Util/Image.class.php 文件。
訪問驗證碼
可以直接在瀏覽器里訪問該驗證碼方法以確定驗證碼是否能正常顯示:
http://127.0.0.1/index.php/Public/verify
如果一切正常,顯示驗證碼如下所示:
表單中使用驗證碼
在表單頁面中使用驗證碼,是以 html img標簽 來調用:
1
2
|
< input type = "text" name = "verify" > < img id = "verifyImg" src = "-Article-verify" onClick = "changeVerify()" title = "點擊刷新驗證碼" /> |
src 屬性值即為驗證碼方法訪問地址,視實際情況不同而不同。
驗證碼刷新
當點擊驗證碼圖片時,觸發 JavaScript changeVerify() 函數重新讀取驗證碼,從而實現驗證碼刷新。該函數參考如下:
1
2
3
4
5
6
|
<script language= "JavaScript" > function changeVerify(){ var timenow = new Date().getTime(); document.getElementById( 'verifyImg' ).src= '-Article/verify/' +timenow; } </script> |
驗證碼驗證
在調用驗證碼 verify 的時候,buildImageVerify 會記錄本次驗證碼的 MD5 信息。在表單驗證操作里,以如下方法來檢查驗證碼是否正確:
1
2
3
|
if ($_SESSION[ 'verify' ] != md5($_POST[ 'verify' ])) { $ this ->error( '驗證碼錯誤!' ); } |
其中 $_SESSION['verify'] 中的 verify 名稱為 buildImageVerify 方法默認 SESSION 注冊名稱,具體見 buildImageVerify 語法。
上面例子演示了最簡單的 ThinkPHP 驗證碼的使用方法。上面的例子驗證碼是 4 位數字,如果想使用更多風格的驗證碼以及中文驗證碼,參見本節其余部分內容:《ThinkPHP 使用不同風格及中文的驗證碼》。
驗證碼不顯示原因
如下發現無法顯示驗證碼,可能的原因如下:
1、PHP 是否已經安裝 GD 庫支持。
2、輸出之前是否有任何的輸出(尤其是 UTF8 的 BOM 頭信息輸出)。
3、Image 類庫是否正確導入。
4、如果是表單頁面,請查看是否正確調用了驗證碼顯示方法。
下面就為大家介紹 thinkphp3.2 驗證碼生成和點擊刷新驗證碼的實現方法,具體內容如下
一、實例化生成驗證碼的類(該方法放到IndexController里面便于訪問)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/** * * 驗證碼生成 */ public function verify_c(){ $Verify = new \Think\Verify(); $Verify ->fontSize = 18; $Verify ->length = 4; $Verify ->useNoise = false; $Verify ->codeSet = '0123456789' ; $Verify ->imageW = 130; $Verify ->imageH = 50; //$Verify->expire = 600; $Verify ->entry(); } |
二、前臺需要生成驗證碼的圖片src屬性指向
1
2
3
4
|
< p class = "top15 captcha" id = "captcha-container" > < input name = "verify" width = "50%" height = "50" class = "captcha-text" placeholder = "驗證碼" type = "text" > < img width = "30%" class = "left15" height = "50" alt = "驗證碼" src = "{:U('Home/Index/verify_c',array())}" title = "點擊刷新" > </ p > |
三、寫完上面的后,頁面初始化的驗證碼就可以出現了,下面要寫的就是點擊驗證碼圖片后,刷新出新的驗證碼圖片(通過jquery修改圖片的src屬性來完成,請求的處理函數一樣,只是在請求后加一個隨機數,區別上一張圖片的請求)
1
2
3
4
5
6
7
8
9
10
11
|
// 驗證碼生成 var captcha_img = $( '#captcha-container' ).find( 'img' ) var verifyimg = captcha_img.attr( "src" ); captcha_img.attr( 'title' , '點擊刷新' ); captcha_img.click( function (){ if ( verifyimg.indexOf( '?' )>0){ $( this ).attr( "src" , verifyimg+ '&random=' +Math.random()); } else { $( this ).attr( "src" , verifyimg.replace(/\?.*$/, '' )+ '?' +Math.random()); } }); |
四、校驗驗證碼輸入是否正確
a.在common目錄下的function.php里加入全局函數
1
2
3
4
5
6
7
|
/** * 驗證碼檢查 */ function check_verify($code, $id = "" ){ $verify = new \Think\Verify(); return $verify->check($code, $id); } |
b.在表單提交的controller對應的處理方法里添加檢查代碼
1
2
3
4
5
|
// 檢查驗證碼 $verify = I( 'param.verify' , '' ); if (!check_verify( $verify )){ $this ->error( "親,驗證碼輸錯了哦!" , $this ->site_url,9); } |
到此tp3.2驗證碼的使用就可以了。
補充:我在寫的時候將四的b步驟放到一個ajax里驗證,返回一次檢驗結果。然后再依據返回結果確定是否要提交表單,但是在驗證碼通過第一次的校驗后,第二次的就不可以了,目前還沒想明白原因。
這就是本文的全部內容,文章最后還有一個小小的疑問,希望大家可以想出解決辦法,也希望本文對大家的學習有所幫助。