我想让我的注册页面显示验证码。我有一个注册控制器和一个注册视图
这是我的控制器索引方法:
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);