使用CodeIgniter创建验证码


Creating a CAPTCHA with CodeIgniter

我想让我的注册页面显示验证码。我有一个注册控制器和一个注册视图

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

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)我理解这是一个控制器函数,所以如果你想传递给一个视图的"cap"变量应该做这样的事情:

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

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

2)如果你想遵循MVC模式,你应该封装数据库调用的模型,支持Codeigniter: http://codeigniter.com/user_guide/general/models.html

在你的行

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

我知道你想在BBDD中保存captcha信息,不是吗?所以你应该用验证码模型发送信息:

  • 在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);