Codeigniter验证将查询行转换为数组

时间:2011-08-21 08:55:46

标签: arrays validation codeigniter

我最近经历了一个非常奇怪的错误。我正在写一个密码重置功能,但我遇到了一个我从未经历过的非常奇怪的错误。不知何故,表单验证将我的查询转换为空数组。

这是我的代码:

public function password_reset()
{
    if ($this->auth_model->is_logged_in()) redirect ('welcome');

        $userid = $this->uri->segment(3);
        $code = $this->uri->segment(4);

        $this->db->select('forgot_password, id');
        $this->db->from('users');
        $this->db->limit(1);
        $this->db->where('id',$userid);
        $q = $this->db->get();

    if (!is_numeric($this->uri->segment(4, 0)) == TRUE && !is_numeric($this->uri->segment(3, 0)) == TRUE) die;

        if ($q->row('forgot_password') == $code) {

            $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');
            $this->form_validation->set_rules('confirm_password', 'Confirm', 'required|min_length[4]');

            if ($this->form_validation->run() !== false) {

                if ($this->input->post('password') != $this->input->post('confirm_password')) exit("wrong");

                $update = array (
                    'password' => sha1($this->input->post('password'))
                );

                $id = $q->row('id');

                $this->db->where('id', $id);
                $this->db->update('users', $update);
                echo $this->db->last_query();
                die; // Don't mind the last 2 lines, they were made for debugging purposes.

                echo "Password is reset";

            } $this->load->view('auth/password_reset');

        }

}

请注意这一行: $ id = $ q-> row('id');

这是问题的开始。

如果我回显此行,将获得“数组”,我尝试在其上执行print_r但它似乎是完全空的数组。

但是,如果我尝试回应

$q->row('id');

if ($this->form_validation->run() !== false) {

然后,我得到了预期的结果,在我的情况下它将是整数,但是,一旦表单验证将被传递,它将把我的整数变成空数组。

所以我们在这里,表单验证以某种方式将我的查询行转换为数组。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你在哪里使用:

$q = $this->db->get();
//...
if ($q->row('forgot_password') == $code) {

您应该只使用row()一次获取对象,然后引用该对象的属性,而不是一遍又一遍地调用row()

所以,为了让你能够解决这个问题(你的代码可能还有其他问题但我们在得到这个问题之前就不会知道),试试这样的事情:

$row = $this->db->get()->row();

获取结果(第一行)。完成后,现在您将结果存储在对象中,而无需再次获取它。

现在,当你想要引用该对象的属性时,在这种情况下列的值,你将使用它:

if ($row->forgot_password == $code) {}
//
$id = $row->id;

等等。请继续阅读文档,了解更多演示:http://codeigniter.com/user_guide/database/results.html

答案 1 :(得分:0)

最好使用result_array()并根据参数检查第一条记录......

$q = $this->db->select('forgot_password, id')
              ->from('users')
              ->limit(1)
              ->where('id',$userid)
              ->get();
$res = $q->result_array();
$forgot_password = (count($res[0]) == 1) $res[0]['forgot_password'] : FALSE;
...
// And change this line
// if ($q->row('forgot_password') == $code) {
// into
if ( ! $forgot_password)
{
   // Theres no record match with $userid
}
elseif($forgot_password == $code)
{
   // Everythings fine...
}
else
{
   // Theres a record match with $userid, but the $code not match
}