In this article, we will discuss, How to create a Login with OTP in MySQL database using the CodeIgniter.
1. Create MySQL Table user_info
CREATE TABLE `user_info` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `name` VARCHAR(255) NOT NULL , `mobile` VARCHAR(255) NOT NULL , `otp` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB;
2. Create a controller file Signin.php in the applications/controllers/ directory.
class Signin extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->model('Signin_model');
}
public function sign_in() {
$this->load->view('sign_in');
}
public function login() {
$mobile = $this->input->post('mobile');
$user = $this->login_model->check_mobile($mobile);
if($user) {
// Generate OTP
$otp = $this->generate_otp();
$data = [
'otp' => $otp,
];
// update otp in database
$this->login_model->update_otp($mobile, $data);
// send otp on mobile number
$message = $otp." is your OTP. Do not share with anyone.";
$this->send_sms($mobile, $message);
$data['mobile'] = $mobile;
$this->load->view('otp', $data);
} else {
echo "Invalid mobile number";
}
}
public function send_sms($phone, $body) {
// Your authentication key
$authKey = 'auth_key';
// Multiple mobiles numbers separated by comma
// Sender ID,While using route4 sender id should be 6 characters long.
$senderId = 'CXSTEC';
// Your message to send, Add URL encoding here.
$message = urlencode($body);
//Define route
$route = 'trans';
//Prepare you post parameters
$postData = array(
'authkey' => $authKey,
'mobiles' => $phone,
'message' => $message,
'sender' => $senderId,
'route' => $route
);
//API URL
$url = 'http://api.msg91.com/api/sendhttp.php';
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData
));
//Ignore SSL certificate verification
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//get response
$output = curl_exec($ch);
curl_close($ch);
}
public function generate_otp() {
$OTP = rand(1,9);
$OTP .= rand(0,9);
$OTP .= rand(0,9);
$OTP .= rand(0,9);
$OTP .= rand(0,9);
$OTP .= rand(0,9);
return $OTP;
}
public function verify() {
$mobile = $this->input->post('mobile');
$otp = $this->input->post('otp');
// check for otp
$user = $this->login_model->verify($mobile, $otp);
if($user) {
$this->session->set_userdata($user);
redirect('user/dashboard');
} else {
echo "Invalid OTP or Mobile number.";
}
}
}3. Create a controller file User.php in the applications/controllers/ directory.
class User extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->library('session');
$this->load->model('Signin_model');
}
public function index() {
$this->dashboard();
}
public function dashboard() {
echo "you are successfully logged in";
}
}4. Create a model file Signin_model.php in the applications/models/ directory.
class Signin_model extends CI_Model {
public function check_mobile($mobile) {
$this->db->where(['mobile' => $mobile]);
$query = $this->db->get('user_info');
$result = $query->num_rows();
return $result;
}
public function update_otp($mobile, $data) {
return $this->db->update('user_info', $data, ["mobile"=>$mobile]);
}
public function verify($mobile, $otp) {
$data = [];
$this->db->where([mobile => $mobile, otp => $otp]);
$query = $this->db->get('user_info');
$result = $query->row();
if($result) {
$data = [
'login_id' => $result->id,
'login_name' => $result->name,
'login_mobile' => $result->mobile,
'login_status' => TRUE,
];
}
return $data;
}
}5. Create a sign_in.php file in the applications/views/ directory.
<form method="post"
action="<?php echo base_url('signin/login') ?>">
<table width="600" align="center" border="1"
cellspacing="5" cellpadding="5">
<tr>
<td width="230">Enter Mobile</td>
<td width="329">
<input type="text" name="mobile" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="login"
value="Login" />
</td>
</tr>
</table>
</form>6. Create a verify.php file in the applications/views/ directory.
<form method="post"
action="<?php echo base_url('signin/verify') ?>">
<table width="600" align="center" border="1"
cellspacing="5" cellpadding="5">
<tr>
<td width="230">Enter OTP</td>
<td width="329">
<input type="hidden" name="mobile"
value="<?php echo $mobile; ?>" />
<input type="password" name="otp" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="verify"
value="Verify" />
</td>
</tr>
</table>
</form>