我最近经历了一个非常奇怪的错误。我正在写一个密码重置功能,但我遇到了一个我从未经历过的非常奇怪的错误。不知何故,表单验证将我的查询转换为空数组。
这是我的代码:
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) {
然后,我得到了预期的结果,在我的情况下它将是整数,但是,一旦表单验证将被传递,它将把我的整数变成空数组。
所以我们在这里,表单验证以某种方式将我的查询行转换为数组。
非常感谢任何帮助。
答案 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
}