Welcome Guest, Not a member yet? Register   Sign In
Call to member function on null where post request is valid in var_dump()
#1

(This post was last modified: 06-03-2022, 10:02 AM by AgBRAT.)

** Very new to CodeIgniter so please be kind! **

I have an issue with my two user authentication forms: 'users/register.php' and 'users/login.php' where I cannot pass the post input to functions in my model.

As of now, I'm getting the error 'Call to member function addUser() on null' on the registration form and a validation error on the login form that states the username/password don't match any credentials in the database. Both seem to stem from post being null although it is not.

I have done a var_dump on '$login'` which is defined as '$login = $this->request->getPost()' as well as inspected the request in Firefox Developers Browser to find all the post data correctly displayed. I am stumped. Why can't I pass this array to my model?s a screenshot of the post request?
PHP Code:
// Login and Registration
$routes->match(['get''post'], 'users/register''Users::register');
$routes->match(['get''post'], 'users/login''Users::login', ["filter" => "noauth"]);



class 
UserModel extends Model
{
    protected $DBGroup          'default';
    protected $table            'users';
    protected $primaryKey      'username';
    protected $useAutoIncrement false;
    protected $insertID        0;
    protected $returnType      'object';
    protected $useSoftDelete    false;
    protected $allowedFields    = [
        'username',
        'password',
        'id',
        'role',
        'profile_image',
        'profile_views',
        'last_login',
        'about_me',
        'age',
        'gender',
        'occupation',
        'hometown',
        'country',
        'fav_shape',
        'fav_color',
        'created',
        'modified',
    ];

    // Dates
    protected $useTimestamps    true;
    protected $dateFormat      'datetime';
    protected $createdField    'created';
    protected $modifiedField    'modified';

    // Callbacks
    protected $allowCallbacks  true;
    protected $beforeInsert    = ['beforeInsert'];

    public function __construct() 
    {
        parent::__construct(); 
    }

    protected function beforeInsert(array $data)
    {
        $data $this->passwordHash($data);

        return $data;
    }

    protected function passwordHash(array $data)
    {
        if (isset($data['password'])) {

            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        }

        return $data;
    }

      public function lastLogin($username)
    {
        $this->builder()
            ->where('username'$username)
            ->update('last_login'date('Y-m-d H:i:s'));
    }

    public function addUser($newUser)
    {
        $builder $this->builder()
            ->set($newUser)
            ->insert();

        if ($builder->affected_rows() == 1) {

            return TRUE;

        } else {

            return FALSE;
        }
    }

    public function getUser($username)
    {
        $builder $this->builder()
            ->where(['username' => $username])
            ->limit(1);

        if ($builder->countAllResults() === 1) {

            return $builder->get()->getRow();

        } else {

            return FALSE;
        }
    }
}





class 
Users extends BaseController
{
    protected $userModel;

    public function __construct() 
    {
        $userModel = new UserModel();
    }

    public function login()
    {
        $validation = \Config\Services::validation();

        // Set session variable
        $session session();

        if ($this->request->getMethod() === 'post' && ! empty($_POST)) {  
            $validation
->getRuleGroup('login');
            $validation->setRuleGroup('login');
            $validation->withRequest($this->request)->run(); 

            $recaptchaResponse trim($this->request->getVar('g-recaptcha-response'));

            $userIp $this->request->getIPAddress();

            $secret env('recaptcha2_secretkey');

            $credential = [
                'secret'    => $secret,
                'response'  => $recaptchaResponse,
                'remoteip'  => $userIp,
            ];

            $verify curl_init();

            curl_setopt($verifyCURLOPT_URL'https://www.google.com/recaptcha/api/siteverify');
            curl_setopt($verifyCURLOPT_POSTTRUE);
            curl_setopt($verifyCURLOPT_POSTFIELDShttp_build_query($credential));
            curl_setopt($verifyCURLOPT_SSL_VERIFYPEERFALSE);
            curl_setopt($verifyCURLOPT_RETURNTRANSFERTRUE);

            $response curl_exec($verify);

            $status json_decode($responseTRUE);

            curl_close($verify);

            if (empty($validation->getErrors()) && $status['success']) {
                $login $this->request->getPost();

                $user $this->userModel->getUser($login['username']);

                // Storing session values
                $this->setUserSession($user);

                // Storing success message
                $session->setFlashdata('success''You have successfully logged in!');

                // Update last login datetime
                $this->userModel->lastLogin($login['username']);

                // Redirecting to dashboard after login
                if ($user['role'] == 1) {

                    return redirect()->to('admin/dashboard');

                } elseif ($user['role'] == 0) {

                    return redirect()->to('members/dashboard');
                }
            } else {

                $data = [
                    'title'    => 'Login',
                    'errors'    => $validation->getErrors(),
                ];

                echo view('templates/index_header'$data);
                echo view('users/login');
                echo view('templates/footer'$data);
            }  
        
} else {
            $data = [
                'title' => 'Login',
            ];

                echo view('templates/index_header'$data);
                echo view('users/login');
                echo view('templates/footer'$data);  
        
}
    }

/**
    * Sets session with user id, username, isLoggedIn, and role for use in member/admin site
    * @param model user data
    * @return boole if session was set successfully
    */
    private function setUserSession($user)
    {
        $data = [
            'id' => $user->id,
            'username' => $user->username,
            'profile_image' => $user->profile_image,
            'isLoggedIn' => true,
            'role' => $user->role,
        ];

        if (session()->set($data)) {

            return true;

        } else {

            return false;
        }
    }

public function 
register() 
    {
        $validation = \Config\Services::validation();

        if ($this->request->getMethod() == 'post' && ! empty($_POST)) {

            $validation->getRuleGroup('registration');
            $validation->setRuleGroup('registration');
            $validation->withRequest($this->request)->run(); 

            if (empty($validation->getErrors())) {

                $newUser $this->request->getPost();

                if ($this->userModel->addUser($newUser)) {

                    $this->session->setFlashdata('success''Successful Registration');

                    $data['title'] = 'Login';

                    echo view('templates/index_header'$data);
                    echo view('users/login');
                    echo view('templates/footer'$data);

                } else {

                    $this->session->setFlashdata('error''Something went wrong with your registration! Please try again.');
                }

            } else {

                $data = [];

                $data = [
                    'title'    => 'Register',
                    'script'    => 'js/click_link',
                    'errors'    => $validation->getErrors(),
                ];

                echo view('templates/index_header'$data);
                echo view('users/register'$data);
                echo view('templates/footer'$data);
            }
        } else {
            $data = [
                'title'        => 'Register',
                'script'        => 'js/click_link',
            ];

            echo view('templates/index_header'$data);
            echo view('users/register'$data);
            echo view('templates/footer'$data);
        }
    }
}



/**
    *  Registration
    */
    public $registration = [
        'username'      => 'required|is_unique[users.username,username]|min_length[5]|max_length[25]|alpha_dash|badWordsFilter[username]',
        'password'      => 'required|min_length[8]|max_length[255]|regex_match[/^(?=.*[!@#$%^&*-])(?=.*[0-9])(?=.*[A-Z]).{8,255}$/]',
        'pass_confirm'  => 'required|matches[password]',
        'about_me'      => 'permit_empty|max_length[250]|alpha_numeric_punct|badWordsFilter[about_me]',
        'occupation'    => 'permit_empty|max_length[50]|alpha_space|badWordsFilter[occupation]',
        'hometown'      => 'permit_empty|max_length[50]|alpha_space|badWordsFilter[hometown]',
        'age'          => 'permit_empty|less_than[100]|greater_than[0]|numeric',
        'country'      => 'permit_empty',
    ];
/**
    *  Password Verification
    */
    public $login = [
        'password'      => 'required|validateUser[username,password]',
    ];





class 
User_rules 
{
    /**
    * Checks if input username exists in database and then checks whether the input password matches the hash for that username
    * @param string $str is the input password
    * @param string $fields are the associated form fields that are being used
    * @param array $data is an array containing the values for the fields indexed by field names
    * @return boolean true or false depending on if the user exists and the password matches the hashed password stored in the database
    */
    public function validateUser(string $strstring $fields, array $data)
    {
        $userModel = new UserModel();

        $user $userModel->getUser($data['username']);

        if(!$user) {

            return FALSE;
        }

        return password_verify($data['password'], $user->password);
    

Reply
#2

Are you new to PHP?

The following `$userModel` is a local variable, not a class property.
It should be `$this->userModel`.

PHP Code:
    public function __construct() 
    {
        $userModel = new UserModel();
    

Quote:The pseudo-variable $this is available inside any class method when that method is called from within an object context. $this is the value of the calling object.
https://www.php.net/manual/en/language.o...erties.php
Reply
#3

Thank you! Yes, I'm fairly new to php as well. I'm teaching myself and recently moved over to codeigniter 4 to learn MVC framework. You just helped me after being stuck for days.
Reply




Theme © iAndrew 2016 - Forum software by © MyBB