使用CodeIgniter尝试在用户名不正确时获取非对象的属性

时间:2017-11-06 05:14:49

标签: php codeigniter

我正在使用password_verify来检查密码是否正确,这是完美的。我的问题是当用户输入错误的用户名点击登录按钮时,我收到错误"Trying to get property of non-object"

出现错误,它应显示验证错误消息。

如果我输入正确的用户名和错误的密码,而不是我收到正确的验证错误消息(密码无效)但是如果我输入了错误的用户名和正确的密码,那么我收到错误"Trying to get property of non-object"。 你能帮我解决这个问题吗?

控制器

public function login_user()
 {

    $this->form_validation->set_error_delimiters('', '');
    $this->form_validation->set_rules('user_email', 'Email', 'trim|required|valid_email');
    $this->form_validation->set_rules('user_password', 'Password', 'trim|required|xss_clean|callback_check_password_database');
if ($this->form_validation->run() == FALSE)
{
  $this->load->view('login');
}
else
{
  //redirect(base_url('Student_controller/index'),'refresh'); 
}

 }

 /*Checking the login details*/
function check_password_database($user_password)
{
    $a_username=$this->input->post('user_email');
if (empty($a_username)) {
         $this->form_validation->set_message('check_password_database','Email is Invalid');
}
else{
   $password_fetch=$this->access_model->password_fetch($a_username);
   if(password_verify($user_password, $password_fetch))
    {
     redirect('Student_controller/index','refresh'); 
    }
    else{
       $this->form_validation->set_message('check_password_database','Password is Invalid');
       return FALSE;
  }
}
}

模型

public function password_fetch($username)
{
        $query=$this->db->select('emp_password')
                ->from('employee_info')
                ->where('emp_email',$username)
                ->get();
$result = $query->row();  
return $fetch_pass=$result->emp_password;

}

3 个答案:

答案 0 :(得分:0)

您必须尝试直接访问阵列。在$a_username$password_fetch之间,必须是您直接尝试访问的数组。

您必须回显它们以查找值是如何存储在它们中的。尝试使用echo $a_username;die;打印它们,同样地打印另一个。

如果是数组,请尝试打印echo "<pre>";print_r$(a_username); 同时在模型中初始化$fetch_pass="";

答案 1 :(得分:0)

更改模型

public function password_fetch($username)
{
        $fetch_pass = false;
        $query=$this->db->select('emp_password')
                ->from('employee_info')
                ->where('emp_email',$username)
                ->get();
        $result = $query->row();  
        if (isset($row) && ($row > 0)) {

                $fetch_pass=$result->emp_password;
        }
        return $fetch_pass;
}

答案 2 :(得分:0)

你在做什么

return $fetch_pass = $result->emp_password;

不验证$result实际上是否为对象。如果用户不存在,则$result将不是对象。因此,尝试在emp_password不是对象时获取$result,会向您显示错误消息尝试获取非对象的属性

请改为:

if (isset($row)) {
    return $result->emp_password;
}

进一步参考:https://www.codeigniter.com/userguide3/database/results.html

旁注,an application should respond with a generic error message regardless of whether the user ID or password was incorrect. It should also give no indication to the status of an existing account.