最近在使用CI验证码的时候发现了一些问题,这里提出并解决之。
1.当然是显示不出验证码的问题, 如果按照文档类似这种代码
$vals = array(
'img_path' => '/uploads/captcha/',
'img_url' => base_url('uploads/captcha').'/',
'img_width' => 100,
'img_height' => 40,
'expiration' => 300
);
$cap = create_captcha($vals);
发现无法获取cap的值,或者说返回的值是false, 可能原因是
- 确保img_path,img_url不为空
- 确保img_path是个正确路径,这里填写相对路径可能会返回空
- img_path必须可写,windows服务器不存在这个问题
- GD库没有启用
个人这里出现问题是因为img_path写的相对路径,改成绝对路径就返回正确的值了。 代码如下
$vals = array(
'img_path' => dirname(BASEPATH).'/uploads/captcha/',
'img_url' => base_url('uploads/captcha').'/',
'img_width' => 100,
'img_height' => 40,
'expiration' => 300
);
$cap = create_captcha($vals);
如果有值但是不显示看是不是img_url少了“/”。
2.captcha存入数据库,我看官方文档里面说使用数据库存储,在获取的时候,使用字符串和IP再加过期判断,个人觉得这里很有问题, 首页用户主动刷新验证码的时候,数据库里面的旧验证码是肯定没有过期的,这个时候如果用户不是输入新的,仍然输入旧的这里仍能够验证通过,当然如果你说用户如果能识别出旧的就不刷新了,我这个顾虑是多余的,也是有道理。我这里只是提出问题。
3.如果不想存入数据库,可以选择存入session或者cookie,这样反而简单很多,你根本不用去写入,查询和删除那些记录。只要将 里面word的值记录下来就行了。
4.如果闲验证码里面的字符个数过多,1.直接修改这个helper辅助文件,或者重写下,保存成MY_captcha_helper.php 也是可以的。
一个完整的captcha解决方案如下:添加一个model 叫做captcha
<?php
class Captcha extends CI_Model
{
function __construct()
{
parent::__construct();
$this->load->helper('captcha');
}
public function get_captcha(){
//由于CI本身使用的是8个验证字符,这里为了不是用那么多,又不原意重写helper,只好自己设置验证码的内容
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str = '';
for ($i = 0; $i < 5; $i++)
{
$str .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
}
$word = $str;
$vals = array(
'word' => $word,
'img_path' => dirname(BASEPATH).'/uploads/captcha/',
'img_url' => base_url('uploads/captcha').'/',
'img_width' => 100,
'img_height' => 40,
'expiration' => 300
);
$cap = create_captcha($vals);
$cap['image'] = str_replace('<img', 'session->set_userdata('captcha_cache', $cap['word']);
return $cap;
//由于将验证码 存入数据库,用户在验证码没有过期前仍能够查得到记录所有这里不使用数据库了
}
}
// END M_User class
/* End of file captcha.php */
/* Location: ./application/models/captcha.php */
调用:
$this->load->model('Captcha');
$cap = $this->Captcha->get_captcha();
(4945)