代码之家  ›  专栏  ›  技术社区  ›  JDoxx

PHP CodeIgniter:登录404错误“试图获取非对象的属性”email“

  •  0
  • JDoxx  · 技术社区  · 7 年前

    我最近开始学习PHP CodeIgniter的一些编码教程,我的登录和注册系统遇到了一些障碍。注册工作非常完美,可以访问数据库并创建帐户,但我的登录代码有一个问题,我无法解决。

    我收到以下错误:

    遇到PHP错误严重性:注意

    消息:正在尝试获取非对象的属性“email”

    文件名:控制器/身份验证。php

    行号:23

    回溯跟踪:

    文件:/opt/lampp/htdocs/application/controllers/Auth。php行:23 函数:\u error\u handler

    文件:/opt/lampp/htdocs/index。php行:315函数:require\u once

    以下代码为:

        <?php
    
    class Auth extends CI_Controller{
    
        public function login()
        {
            $this->form_validation->set_rules('username', 'Username', 'required');
            $this->form_validation->set_rules('password', 'Password', 'required|min_length[5]');
            if($this->form_validation->run() == TRUE) {
    
                $username = $_POST['username'];
                $password = md5($_POST['password']);
    
                //check user in db
    
                $this->db->select('*');
                $this->db->from('users');
                $this->db->where(array('username'=>$username, 'password'=>$password));
                $query = $this->db->get();
    
                $user = $query->row();
    
                if ($user->email){
                    $this->session->set_flashdata("success", "You are logged in.");
    
                    $_SESSION['user_logged'] = TRUE;
                    $_SESSION['username'] = $user->username;
    
                    //redirect to profile page
    
                    redirect("user/profile", "refresh");
                } else {
                    $this->session->set_flashdata("error", "NO such account exists");
                    //redirect("auth/login", "refresh");
                }
    
            }       
            $this->load->view('login');
        }
    
    public function register()
        {
            if(isset($_POST['register'])) {
                $this->form_validation->set_rules('username', 'Username', 'required');
                $this->form_validation->set_rules('email', 'Email', 'required');
                $this->form_validation->set_rules('password', 'Password', 'required|min_length[5]');
                $this->form_validation->set_rules('password', 'Confirm Password', 'required|min_length[5]|matches[password]');
    
                if($this->form_validation->run() == TRUE) {
                    //echo 'form validated';
    
                    //add user in database
    
                    $data = array(
                        'username'=>$_POST['username'],
                        'email'=>$_POST['email'],
                        'password'=> md5($_POST['password'])
                    );
                    $this->db->insert('users', $data);
    
                    $this->session->set_flashdata("success", "Your account has been registered");
                    redirect("auth/register", "refresh");
                }
            }
            $this->load->view('register');
        }
    } 
    
    ?>
    

    任何帮助都将不胜感激,如果我在本教程中使用的代码需要解决方案,请告诉我。

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Alex    7 年前

    当数据库中的结果对象没有返回任何行时,就会出现这种错误,因此stdClass为空,因此您将无法访问任何属性。正确的方法是检查 num_rows() 等于1(例如,只有一个用户具有该名称和密码)。

    public function login() {
        $this->form_validation->set_rules('username', 'Username', 'required');
        $this->form_validation->set_rules('password', 'Password', 'required|min_length[5]');
        if ($this->form_validation->run() == TRUE) {
    
            $username = $_POST['username'];
            /**
             * Do not md5 your passwords!
             * Use password_hash and password_verify!!
             */
            $password = md5($_POST['password']); // DO NOT MD5 your passwords!
    
            //check user in db
            // this should be in a model!
            $this->db->select('*');
            $this->db->from('users');
            $this->db->where(array('username' => $username, 'password' => $password));
            $query = $this->db->get();
    
            if ($query->num_rows() == 1) {
                $user = $query->row();
                $this->session->set_flashdata("success", "You are logged in.");
    
                $_SESSION['user_logged'] = TRUE;
                $_SESSION['username'] = $user->username;
    
                //redirect to profile page
                redirect("user/profile", "refresh");
            } else {
                $this->session->set_flashdata("error", "NO such account exists");
                //redirect("auth/login", "refresh");
            }
        }
        $this->load->view('login');
    }
    

    一般来说,你应该养成检查 num_rows() > 0 在使用之前 result() row() ,因为您永远无法百分之百确定数据是否会返回。

    例如:

    //model
    
    function get_users() {
         $query = $this->db->get('users');
         if ($query->num_rows() == 0) {
              return null;
         }
         return $query->result();
    }
    
    // controller
    
    function something() {
        $users = $this->model->get_users();
        if (is_null($users)) {
             exit('no users');
        }
        print_r($users);
    }