-
AgBRAT Junior Member
 
-
Posts: 25
Threads: 11
Joined: May 2022
Reputation:
0
06-03-2022, 08:30 AM
(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($verify, CURLOPT_URL, 'https://www.google.com/recaptcha/api/siteverify'); curl_setopt($verify, CURLOPT_POST, TRUE); curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($credential)); curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($verify, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($verify);
$status = json_decode($response, TRUE);
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[/^(?=.*[[email protected]#$%^&*-])(?=.*[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 $str, string $fields, array $data) { $userModel = new UserModel();
$user = $userModel->getUser($data['username']);
if(!$user) {
return FALSE; }
return password_verify($data['password'], $user->password); }
-
kenjis Posting Freak
    
-
Posts: 1,368
Threads: 31
Joined: Oct 2014
Reputation:
88
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
|