phpmysqlcodeignitermodel-view-controlleractiverecord

SELECT query to check if logged-in user has positive column value using CodeIgniter


I'm writing a simple app. I need to block user from a page if their credit is < 0.

I have a table "User_profiles" with a "credit" column.

How can I set up a model in conjunction with the controller to send the user to another page if the value of credit is 0?

This should be straight forward, but I'm new at the select->where stuff.

It has to be the row of the current user too -- I don't know how to traverse arrays very well yet.


Solution

  • Well, the easiest solution would be to just load a different view...

    As for the model, it would look like this:

    class UserModel extends Model {
        public function getUserCredit($id) {
            $this->load->database();
            //effectively generates: SELECT `credit` FROM `User_profiles` WHERE `id`=$id
            $query = this->db->select('credit')->where('id',$id)->get('User_profiles');
            //row() executes the query for a single result, returns the credit property
            return $query->row()->credit;
        }
    }
    

    Then in the controller:

    class Users extends Controller {
        //....
        public function credit() {
            $this->load->model('userModel','users');
            // assuming the session library has been loaded
            $user_id = $this->session->userdata('id');
            $credit = $this->users->getUserCredit($user_id);
            if ($credit == '0') $this->load->view('users/no_credit');
            else $this->load->view('users/credit');
        }
    }
    

    That's untested, but it should at least help you get the idea.


    1. When you request the page /users/credit/1, CI will call the Users::credit(1) action.

    2. It then loads UserModel as $this->users

    3. You call $this->users->getUserCredit(1), which translates to UserModel::getUserCredit(1), to store as $credit

    4. The model loads the database.

    5. You tell the db to select('credit') (select the credit column), where('id',1) (where the id = 1), then get('User_profiles') (get matching rows from the User_profiles table). That returns a query, which you store as $query for readability.

    6. getUserCredit returns the credit property of the single-row result of the query

    7. If $credit == 0, you load the view views/users/no_credit.php

    8. Otherwise, you load the view views/users/credit.php (it's conventional to name the views after the actions they represent and put them in a folder corresponding to the controller)