再介紹thinkphp3.2驗證碼的使用方法之前,先為大家詳細介紹ThinkPHP 驗證碼,具體內容如下
ThinkPHP 內建了驗證碼的支持,可以直接使用。要使用驗證碼,需要匯入擴充類別庫中的 ORG.Util.Image 類別庫和 ORG.Util.String 類別庫。
驗證碼方法
我們透過在模組類別中增加一個verify 方法來用於顯示驗證碼,最簡單的例子:
Public function verify(){ // 导入Image类库 import("ORG.Util.Image"); Image::buildImageVerify(); }
import 方法是ThinkPHP 內建的類別庫和檔案導入方法,上例導入的檔案為ThinkPHP 系統目錄下Lib/ORG/Util/Image.class.php 檔案。如果已經將Image 類別庫拷貝到了目前專案下,如Lib/ORG 下,則可以以:
import("@.Util.Image");
import 方法是ThinkPHP 內建的類別庫和檔案匯入方法,上例匯入的檔案為ThinkPHP 系統目錄下Lib/ORG/Util/Image.class.php 檔案。
存取驗證碼
可以直接在瀏覽器中存取該驗證碼方法以確定驗證碼是否能正常顯示:
http://127.0.0.1/index.php/Public/verify
如果一切正常,顯示驗證碼如下所示:
表單中使用驗證碼
在表單頁中使用驗證碼,是以html img標籤來呼叫:
<input type="text" name="verify"> <img id="verifyImg" src="-Article-verify" onClick="changeVerify()" title="点击刷新验证码" / alt="thinkphp3.2點選刷新產生驗證碼" >
src 屬性值即為驗證碼方法存取位址,視實際情況而不同。
驗證碼刷新
當點擊驗證碼圖片時,觸發 JavaScript changeVerify() 函數重新讀取驗證碼,從而實現驗證碼刷新。函數參考如下:
<script language="JavaScript"> function changeVerify(){ var timenow = new Date().getTime(); document.getElementById('verifyImg').src='-Article/verify/'+timenow; } </script>
驗證碼驗證
在呼叫驗證碼 verify 的時候,buildImageVerify 會記錄本次驗證碼的 MD5 資訊。在表單驗證操作裡,以以下方法檢查驗證碼是否正確:
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裡面便於存取)
/** * * 验证码生成 */ 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屬性指向
<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" style="max-width:90%" alt="验证码" src="{:U('Home/Index/verify_c',array())}" title="点击刷新"> </p>
三、寫完上面的後,頁面初始化的驗證碼就可以出現了,下面要寫的就是點擊驗證碼圖片後,刷新出新的驗證碼圖片(透過jquery修改圖片的src屬性來完成,請求的處理函數一樣,只是在請求後加一個隨機數,區別上一張圖片的請求)
// 验证码生成 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裡加入全域函數
/** * 验证码检查 */ function check_verify($code, $id = ""){ $verify = new \Think\Verify(); return $verify->check($code, $id); }
b.在表單提交的controller對應的處理方法裡添加檢查碼
// 检查验证码 $verify = I('param.verify',''); if(!check_verify($verify)){ $this->error("亲,验证码输错了哦!",$this->site_url,9); }
到此tp3.2驗證到此tp3.2驗證碼使用就可以了。
補充:我在寫的時候將四的b步驟放到一個ajax裡驗證,回傳一次檢驗結果。然後再依據回傳結果確定是否要提交表單,但是在驗證碼通過第一次的校驗後,第二次的就不行了,目前還沒想明白原因。
這就是本文的全部內容,文章最後還有一個小小的疑問,希望大家可以想出解決辦法,也希望本文對大家的學習有所幫助。
更多thinkphp3.2點選刷新產生驗證碼相關文章請關注PHP中文網!