目录搜索
欢迎目录快速参考图基本信息服务器要求许可协议变更记录关于CodeIgniter安装下载 CodeIgniter安装指导从老版本升级疑难解答介绍开始CodeIgniter 是什么?CodeIgniter 速记表支持特性应用程序流程图模型-视图-控制器架构目标教程内容提要加载静态内容创建新闻条目读取新闻条目结束语常规主题CodeIgniter URL控制器保留字视图模型辅助函数使用 CodeIgniter 类库创建你自己的类库使用 CodeIgniter 适配器创建适配器创建核心系统类钩子 - 扩展框架的核心自动装载资源公共函数URI 路由错误处理缓存调试应用程序以CLI方式运行管理应用程序处理多环境PHP替代语法安全开发规范类库参考基准测试类日历类购物车类配置类Email 类加密类文件上传类表单验证详解FTP 类图像处理类输入类Javascript 类语言类装载类迁移类输出类分页类模板解析器类安全类Session 类HTML 表格类引用通告类排版类单元测试类URI 类User-Agent 类表单验证XML-RPC 和 XML-RPC 服务器Zip 编码类缓存适配器适配器参考适配器数据库类Active Record 类数据库缓存类自定义函数调用数据库配置连接你的数据库数据库快速入门例子代码字段数据数据库维护类查询辅助函数数据库类查询生成查询记录集表数据事务数据库工具类JavaScript类辅助函数参考数组辅助函数CAPTCHA 辅助函数Cookie Helper日期辅助函数目录辅助函数下载辅助函数Email 辅助函数文件辅助函数表单辅助函数HTML辅助函数Inflector 辅助函数语言辅助函数数字辅助函数路径辅助函数安全辅助函数表情辅助函数字符串辅助函数文本辅助函数排版辅助函数URL 辅助函数XML 辅助函数
文字

CodeIgniter 用户指南 版本 2.1.0

编辑文档、查看近期更改请 登录 或 注册  找回密码
查看原文

CAPTCHA 辅助函数

验证码辅助函数用来生成图片验证码

加载辅助函数

用下面的代码加载验证码辅助函数:

$this->load->helper('captcha');

可用的函数如下:

create_captcha($data)

根据你指定的一系列参数创建验证码图像, 返回值是一个包含此图像数据的数组.

[array]
(
  'image' => IMAGE TAG
  'time' => TIMESTAMP (毫秒)
  'word' => CAPTCHA WORD
)

"image"是实际存在image标记: <img src="http://example.com/captcha/12345.jpg" width="140" height="50" />

这里的"time"是一个毫秒级的时间戳,作为图片文件名(不包含扩展名). 就像这样: 1139612155.3422

"word"是验证码, 如果不提供, 将是一个随机字符串.

使用验证码辅助函数:

加载后你可以向这样产生一个验证码:

$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'];
  • 验证码辅助函数必须需要GD库.
  • 只有 img_path 和 img_url 参数是必须的.
  • 如果"word"未提供, 将自动产生一个ASCII字符串. 你也可以使用自己的词库,从里面随机挑选.
  • 如果未提供TRUE TYPE字体的路径, 将会使用GD自带的字体.
  • "captcha" 目录必须可写(666, or 777)
  • "expiration" (秒) 指定了验证码图片的超时删除时间. 默认是2小时.

配合数据库

为了在提交表单时用到验证,你需要将create_captcha()生成的结果保存到数据库。这样,当用户提交表单时,你就可以验证数据库里是否有此验证码或是否过期。

这是一个数据表的例子:

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`)
);

这是一个使用数据库的例子. 一个带验证码的页面显示如下:

$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 '提交下面的验证码:';
echo $cap['image'];
echo '<input type="text" name="captcha" value="" />';

然后页面提交后如下处理:

// 首先删除旧的验证码
$expiration = time()-7200; // 2小时限制
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration);

// 然后再看是否有验证码存在:
$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 "你必须提交图像上显示的验证码";
}

 

翻译贡献者: CosyBoy, Hex, LSvKing, 杜建宇
最后修改: 2012-02-05 23:50:26
上一篇:下一篇: