使用CodeIgniter创建CAPTCHA

时间:2011-07-31 23:14:54

标签: php codeigniter captcha

我正在尝试让我的注册页面显示CAPTCHA。我有一个注册控制器和一个注册视图。

这是我的控制器索引方法:

public function index()
{
    $this->load->helper('captcha');
    $cap = create_captcha(array(
        'img_path' => './captcha/',
        'img_url' => 'http://localhost/captcha/',
        'img_width' => 150,
        'img_height' => 40
    ));
    $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);

    $this->load->view('header');
    $this->load->view('register', $cap);
    $this->load->view('footer');
}

来自我的注册视图(register.php)的相关位:

<h3>Security question</h3>
<li>
    <label for="captcha">Enter the CAPTCHA code below</label>
    <?php echo $cap['image']; ?>
</li>

问题是,我收到了这个错误:

A PHP Error was encountered
Severity: Notice
Message: Undefined variable: cap
Filename: views/register.php
Line Number: 35

在查看用户指南之后,我从控制器传递到我的视图的数据似乎需要是一个数组或一个对象,而我做我想做的唯一方法是在我的控件中生成验证码生成代码视图文件,它似乎并不真正遵循MVC模式,是吗?

有人有任何提示吗?

1 个答案:

答案 0 :(得分:0)

我已经看到了关于代码的两个注意事项:

1)我明白这是一个控制器功能,所以如果你想传递给一个View,那么“cap”变量应该这样做:

$data['cap'] = $cap;
$this->load->view('register', $data);

Loadview()函数的第一个参数是函数名,第二个参数是一个包含要发送到视图的所有参数的数组,第三个参数是如果要将视图作为原始字符串返回(默认为false)。

2)如果你想要遵循MVC模式,你应该将DB调用封装在设备Codeigniter的模型中:http://codeigniter.com/user_guide/general/models.html

在你的行中

$query = $this->db->insert_string('captcha', $data);
$this->db->query($query);

我知道您想将验证码信息保存在BBDD中,不是吗? 因此,您应该更好地使用验证码模型发送信息:

  • 在models / captcha_model.php中创建模型:

       class Captcha_model extends CI_Model {
          function insert_captcha($captcha){
          //...
          //return true if it works; false otherwise
          }
      }
    
  • 在控制器功能中,您可以使用它:

    $this->load->model('captcha_model');
    $this->captcha_model->insert_captcha($captcha);