annuaire recherche
欢迎 目录 快速参考图 基本信息 服务器要求 许可协议 变更记录 关于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 辅助函数
personnages

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
Article précédent: Article suivant: