Here is the very simple demo for getting user's data from database and login system. I hope you will enjoy the code and comments :)
Just get it step by step, Do not hurry
.htaccess code: (Place inside your CodeIgniter project)
<IfModule mod_rewrite.c>
# Make sure directory listing is disabled
Options +FollowSymLinks -Indexes
RewriteEngine on
# NOTICE: If you get a 404 play with combinations of the following commented out lines
#AllowOverride All
#RewriteBase /wherever/codeginiter/is
# Restrict your site to only one domain
# !important USE ONLY ONE OPTION
# Option 1: To rewrite "www.domain.com -> domain.com" uncomment the following lines.
#RewriteCond %{HTTPS} !=on
#RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# Option 2: To rewrite "domain.com -> www.domain.com" uncomment the following lines.
#RewriteCond %{HTTPS} !=on
#RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
#RewriteCond %{HTTP_HOST} (.+)$ [NC]
#RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
# Remove index.php from URL
#RewriteCond %{HTTP:X-Requested-With} !^XMLHttpRequest$
#RewriteCond %{THE_REQUEST} ^[^/]*/index\.php [NC]
#RewriteRule ^index\.php(.*)$ $1 [R=301,NS,L]
# Keep people out of codeigniter directory and Git/Mercurial data
# RedirectMatch 403 ^/(system|\.git|\.hg).*$
# Send request via index.php (again, not if its a real file or folder)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
<IfModule mod_php5.c>
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>
<IfModule !mod_php5.c>
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
</IfModule>
index.php (Place below code just after)
`define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');`
/**
* Define By Neeraj Singh
*
* Automatic base url
*/
define('APP_URL', ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . "://{$_SERVER['SERVER_NAME']}".str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']));
config/autoload.php
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array('database','session','user_agent','form_validation');
/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('html', 'url', 'form', 'cookie', 'security');
config/routes.php
$route['default_controller'] = 'users';
config/config.php
/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
| http://example.com/
|
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try guess the protocol and path
| your installation, but due to security concerns the hostname will be set
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
$config['base_url'] = APP_URL;
/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = '';
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class, you must set an encryption key.
| See the user guide for more info.
|
| https://codeigniter.com/user_guide/libraries/encryption.html
|
*/
$config['encryption_key'] = 'iT58EbmAQnBjvf7ZYwVxgMqXHhaeC6s2Ny93utcp';
/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_driver'
|
| The storage driver to use: files, database, redis, memcached
|
| 'sess_cookie_name'
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
| 'sess_expiration'
|
| The number of SECONDS you want the session to last.
| Setting to 0 (zero) means expire when the browser is closed.
|
| 'sess_save_path'
|
| The location to save sessions to, driver dependent.
|
| For the 'files' driver, it's a path to a writable directory.
| WARNING: Only absolute paths are supported!
|
| For the 'database' driver, it's a table name.
| Please read up the manual for the format with other session drivers.
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
| 'sess_match_ip'
|
| Whether to match the user's IP address when reading the session data.
|
| WARNING: If you're using the database driver, don't forget to update
| your session table's PRIMARY KEY when changing this setting.
|
| 'sess_time_to_update'
|
| How many seconds between CI regenerating the session ID.
|
| 'sess_regenerate_destroy'
|
| Whether to destroy session data associated with the old session ID
| when auto-regenerating the session ID. When set to FALSE, the data
| will be later deleted by the garbage collector.
|
| Other session cookie settings are shared with the rest of the application,
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
*/
$config['sess_cookie_name'] = 'ci_session';
$config['sess_save_path'] = null;
$config['sess_regenerate_destroy'] = false;
$config['sess_expiration'] = 0;
$config['sess_expire_on_close'] = true;
$config['sess_encrypt_cookie'] = false;
$config['sess_use_database'] = true;
$config['sess_driver'] = 'database';
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = false;
$config['sess_match_useragent'] = false;
$config['sess_time_to_update'] = 300;
ci_sessions mysql table:
DROP TABLE IF EXISTS `ci_sessions`;
CREATE TABLE `ci_sessions` (
`id` varchar(40) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned NOT NULL DEFAULT '0',
`data` blob NOT NULL,
PRIMARY KEY (`id`),
KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql table users (PASSWORD is 'password'):
/*Table structure for table `users` */
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(25) DEFAULT NULL,
`password` varchar(55) DEFAULT NULL,
`first_name` varchar(25) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(10) DEFAULT NULL,
`status` enum('0','1') DEFAULT '0',
`date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
/*Data for the table `users` */
insert into `users`(`uid`,`username`,`password`,`first_name`,`email`,`phone_number`,`status`,`date_created`) values
(1,'scott','5f4dcc3b5aa765d61d8327deb882cf99','Scott','[email protected]','1234567890','1','2017-07-10 22:45:20'),
(2,'mikey','5f4dcc3b5aa765d61d8327deb882cf99','Mikey','[email protected]','3214521412','1','2017-07-10 22:46:14');
Users Controller:
<?php
// security first
defined('BASEPATH') or exit('No direct script access allowed');
/**
* Class User to handle all login and user's related actions
*/
class Users extends CI_Controller
{
/**
* [__construct description]
*/
public function __construct()
{
// call parent constructor
parent::__construct();
// load Users_model as user_model alias
$this->load->model('Users_model', 'user_model');
}
/**
* Index Page for this controller.
*
* Maps to the following URL
* http://example.com/index.php/users
* - or -
* http://example.com/index.php/users/index
* - or -
* Since this controller is set as the default controller in
* config/routes.php, it's displayed at http://example.com/
*
* So any other public methods not prefixed with an underscore will
* map to /index.php/users/<method_name>
* @see https://codeigniter.com/user_guide/general/urls.html
*/
public function index()
{
// check if user already login and session set
if ($this->session->userdata('user_data')['logged_in']) {
// redirect on post page
redirect('posts');
} else {
// else show login page
$this->login();
}
}
/**
* [login description]
* @return [type] [description]
*/
public function login()
{
if ($this->input->post()) {
$data = array();
// validate user name
$this->form_validation->set_rules('username', 'Username', 'required');
// validate user's password
$this->form_validation->set_rules('password', 'Password', 'required');
// chek if validation error
if ($this->form_validation->run() === false) {
// show again login page
$this->load->view('templates/header');
$this->load->view('users/login', $data);
$this->load->view('templates/footer');
} else {
// fetching user
$username = $this->input->post('username', true);
// Encrypted password
$password = md5($this->input->post('password', true));
//login user
$result = $this->user_model->login($username, $password);
// if no false
if ($result) {
//creating session
$user_data = array(
'user_id' => $result->uid,
'username' => $result->username,
'email' => $result->email,
'phone_number' => $result->phone_number,
'first_name' => $result->first_name,
'logged_in' => true
);
$this->session->set_userdata('user_data', $user_data);
// Set message to be sent
$this->session->set_flashdata('user_login', 'Welcome');
// redirect on post page
redirect('posts');
} else {
// Set message to be sent
$this->session->set_flashdata('login_fail', 'Login Failed');
// redirect on login page again
redirect('users/login');
}
}
} else {
// show again login page
$this->load->view('templates/header');
$this->load->view('users/login');
$this->load->view('templates/footer');
}
}
/**
* [get_user description]
* @return [type] [description]
*/
public function get_user()
{
// if user login
if ($this->session->userdata('user_data')['logged_in']) {
$data = array();
$username = $this->session->userdata('user_data')['username'];
// send user id and get data
$data = $this->user_model->get_user($this->session->userdata('user_data')['user_id']);
// if object
if ($data) {
// strip 0 index
$data = array_shift($data);
}
// print_r($data); die;
// Array
// (
// [uid] => 1
// [email] => [email protected]
// [username] => scott
// [phone_number] => 1234567890
// [first_name] => Scott
// )
$this->load->view('templates/header');
$this->load->view('posts/post', array('result' => $data));
$this->load->view('templates/footer');
}
}
/**
* [logout description]
* @return [type] [description]
*/
public function logout()
{
// flush the all session
$this->session->sess_destroy();
// redirect on login page
redirect('users/login');
}
}
/* End of file Users.php */
/* Location: ./application/controllers/Users.php */
Posts Controller:
<?php
// security, security....
(defined('BASEPATH') or exit('No direct script access allowed'));
/**
* Class Posts
*/
class Posts extends CI_Controller
{
/**
* [__construct description]
*/
public function __construct()
{
parent::__construct();
}
/**
* [index description]
* @return [type] [description]
*/
public function index()
{
// check if user already login and session set
if ($this->session->userdata('user_data')['logged_in']) {
$data = array(
// get user name
'name' => $this->session->userdata('user_data')['first_name'],
// get user email
'email' => $this->session->userdata('user_data')['email'],
// get user phone number
'phone_number' => $this->session->userdata('user_data')['phone_number']
);
// show post page header
$this->load->view('templates/header');
// send user data as array in view
$this->load->view('posts/post', $data);
// show post page footer
$this->load->view('templates/footer');
} else {
// get loss in user login page
redirect('users/login');
}
}
}
/* End of file Posts.php */
/* Location: ./application/controllers/Posts.php */
Users Model:
<?php
(defined('BASEPATH') or exit('No direct script access allowed'));
/**
* Class Users Model to intact with user table
*/
class Users_model extends CI_Model
{
/**
* MySQL table
* @var string
*/
private $table = 'users';
/**
* [__construct description]
*/
public function __construct()
{
parent::__construct();
}
/**
* [login description]
* @param [type] $username [description]
* @param [type] $password [description]
* @return [type] [description]
*/
public function login($username, $password)
{
// select table columns
$this->db->select('uid, email, username, phone_number, first_name');
// where user name
$this->db->where('username', $username);
// where password
$this->db->where('password', $password);
// and status = 1
$this->db->where('status', '1');
// from user table
$result = $this->db->get($this->table);
// if rows returns
if ($result->num_rows() === 1) {
// return all rows as object
return $result->row();
} else {
// no result
return false;
}
}
/**
* [get_user description]
* @param [type] $uid [description]
* @return [type] [description]
*/
public function get_user($uid = null)
{
// if user id pass by user
if (!is_null($uid)) {
// select table columns
$this->db->select('uid, email, username, phone_number, first_name');
// get records by user id
$this->db->where('uid', $uid);
// from user table
$query = $this->db->get($this->table);
}
// else user login then get user id from session
else if ($this->session->userdata('user_data')['logged_in']) {
// select table columns
$this->db->select('uid, email, username, phone_number, first_name');
// user session user id
$this->db->where('uid', $this->session->userdata('user_data')['user_id']);
// from user table
$query = $this->db->get($this->table);
} else {
return false;
}
// if record exists
if ($query->num_rows() > 0) {
// return stdClass Object
return $query->result_array();
} else {
return false;
}
}
}
/* End of file Users_model.php */
/* Location: ./application/models/Users_model.php */
Views/templates/header.php:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex, nofollow">
<title>Login in panel - Bootsnipp.com</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
</head>
<body>
Views/templates/footer.php:
</body>
</html>
Views/users/login.php:
<div class="container">
<div id="loginbox" style="margin-top:50px;" class="mainbox col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
<div class="panel panel-info" >
<div class="panel-heading">
<div class="panel-title">Sign In</div>
</div>
<div style="padding-top:30px" class="panel-body" >
<?php // when wrong user name or password or form validation ?>
<?php if (validation_errors() || $this->session->flashdata('login_fail')) : ?>
<div id="login-alert" class="alert alert-danger col-sm-12">
<!-- Form Validation -->
<?php echo validation_errors(); ?>
<!-- Form Validation -->
<!-- Flash Message -->
<?php if($this->session->flashdata('login_fail')) :?>
<?=$this->session->flashdata('login_fail')?>
<?php endif;?>
<!-- Flash Message -->
</div>
<?php endif; ?>
<form id="loginform" class="form-horizontal" role="form" method="post" action="<?=base_url('users/login')?>">
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
<input id="login-username" type="text" class="form-control" name="username" value="" placeholder="Username">
</div>
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
<input id="login-password" type="password" class="form-control" name="password" placeholder="Password">
</div>
<div style="margin-top:10px" class="form-group">
<!-- Button -->
<div class="col-sm-12 controls">
<input type="submit" value="Login" class="btn btn-success">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
Views/posts/post.php:
<div class="container-full">
<div class="navbar navbar-default">
<div class="navbar-header">
<a class="navbar-brand" href="#">Brand</a>
</div>
<ul class="nav navbar-nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li class="divider-vertical"></li>
<li><a href="#">More</a></li>
<li><a href="#">Options</a></li>
</ul>
</div>
<div class="jumbotron text-center">
<h1>
<?php if($this->session->flashdata('user_login')) :?>
<?=$this->session->flashdata('user_login')?>
<?php endif;?>
</h1>
<p class="lead">
<?php if($this->session->userdata('user_data')) :?>
Hello!, <?=$this->session->userdata('user_data')['first_name']?>. Shall we communicate via <?=$this->session->userdata('user_data')['email']?> or <?=$this->session->userdata('user_data')['phone_number']?>
<?php endif;?>
</p>
<p><a class="btn btn-large btn-success" href="<?=base_url('users/logout')?>" target="ext">Log Out</a></p>
</div>
<div class="rows">
<!-- user Information -->
<?php if(isset($result) && is_array($result)): ?>
<table class="table table-striped text-left">
<thead>
<?php echo '<tr><th>',implode('</th><th>', array_keys($result)), '</th></tr>';?>
</thead>
<tbody>
<?php echo '<tr><td>',implode('</td><td>', array_values($result)), '</td></tr>';?>
</tbody>
</table>
<?php endif; ?>
</div>
</div>
<!-- /container full -->
Done!,
Why I am doing this.. ? I Love CodeIgniter and wanna help every one who want to learn or work in CodeIgniter... :)