CAPTCHA 輔助函數(shù)
驗(yàn)證碼輔助函數(shù)用來生成圖片驗(yàn)證碼
加載輔助函數(shù)
用下面的代碼加載驗(yàn)證碼輔助函數(shù):
$this->load->helper('captcha');
可用的函數(shù)如下:
create_captcha($data)
根據(jù)你指定的一系列參數(shù)創(chuàng)建驗(yàn)證碼圖像, 返回值是一個(gè)包含此圖像數(shù)據(jù)的數(shù)組.
[array]
(
??'image' => IMAGE TAG
??'time' => TIMESTAMP (毫秒)
??'word' => CAPTCHA WORD
)
"image"是實(shí)際存在image標(biāo)記:
<img src="http://example.com/captcha/12345.jpg" width="140" height="50" />
這里的"time"是一個(gè)毫秒級的時(shí)間戳,作為圖片文件名(不包含擴(kuò)展名). 就像這樣: 1139612155.3422
"word"是驗(yàn)證碼, 如果不提供, 將是一個(gè)隨機(jī)字符串.
使用驗(yàn)證碼輔助函數(shù):
加載后你可以向這樣產(chǎn)生一個(gè)驗(yàn)證碼:
$vals = array(
????'word' => 'Random word',
????'img_path' => './captcha/',
????'img_url' => 'http://example.com/captcha/',
????'font_path' => './path/to/fonts/texb.ttf',
????'img_width' => '150',
????'img_height' => 30,
????'expiration' => 7200
????);
$cap = create_captcha($vals);
echo $cap['image'];
- 驗(yàn)證碼輔助函數(shù)必須需要GD庫.
- 只有 img_path 和 img_url 參數(shù)是必須的.
- 如果"word"未提供, 將自動產(chǎn)生一個(gè)ASCII字符串. 你也可以使用自己的詞庫,從里面隨機(jī)挑選.
- 如果未提供TRUE TYPE字體的路徑, 將會使用GD自帶的字體.
- "captcha" 目錄必須可寫(666, or 777)
- "expiration" (秒) 指定了驗(yàn)證碼圖片的超時(shí)刪除時(shí)間. 默認(rèn)是2小時(shí).
配合數(shù)據(jù)庫
為了在提交表單時(shí)用到驗(yàn)證,你需要將create_captcha()生成的結(jié)果保存到數(shù)據(jù)庫。這樣,當(dāng)用戶提交表單時(shí),你就可以驗(yàn)證數(shù)據(jù)庫里是否有此驗(yàn)證碼或是否過期。
這是一個(gè)數(shù)據(jù)表的例子:
CREATE TABLE captcha (
?captcha_id bigint(13) unsigned NOT NULL auto_increment,
?captcha_time int(10) unsigned NOT NULL,
?ip_address varchar(16) default '0' NOT NULL,
?word varchar(20) NOT NULL,
?PRIMARY KEY `captcha_id` (`captcha_id`),
?KEY `word` (`word`)
);
這是一個(gè)使用數(shù)據(jù)庫的例子. 一個(gè)帶驗(yàn)證碼的頁面顯示如下:
$this->load->helper('captcha');
$vals = array(
????'img_path' => './captcha/',
????'img_url' => 'http://example.com/captcha/'
????);
$cap = create_captcha($vals);
$data = array(
????'captcha_time' => $cap['time'],
????'ip_address' => $this->input->ip_address(),
????'word' => $cap['word']
????);
$query = $this->db->insert_string('captcha', $data);
$this->db->query($query);
echo '提交下面的驗(yàn)證碼:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';
然后頁面提交后如下處理:
// 首先刪除舊的驗(yàn)證碼
$expiration = time()-7200; // 2小時(shí)限制
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);
// 然后再看是否有驗(yàn)證碼存在:
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
$binds = array($_POST['captcha'], $this->input->ip_address(), $expiration);
$query = $this->db->query($sql, $binds);
$row = $query->row();
if ($row->count == 0)
{
????echo "你必須提交圖像上顯示的驗(yàn)證碼";
}
?