With Live editable table, user can view and edit the list of data on the same page.
You don’t need to send the user to a new page or form for editing the existing record.
In this tutorial, I show how you make live data editing in the HTML table using jQuery AJAX in CodeIgniter 3.

Contents
1. Table structure
In this example, I am using users table.
CREATE TABLE `users` ( `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `name` varchar(80) NOT NULL, `email` varchar(80) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. Configuration
Navigate to application/config/database.php and define Database connection.
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', // Username 'password' => '', // Password 'database' => 'tutorial', // Database name 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
Default controller
Open application/config/routes.php and edit default_controller value to Posts.
$route['default_controller'] = 'Users';
Load Database
To access the MySQL database require loading database library.
Open application/config/autoload.php and add the database in libraries array().
$autoload['libraries'] = array("database");
3. Model
Create a UsersModel.php file in application/models/ directory.
Here, create 2 methods –
- getUsers() – Using this method fetch all records from the
userstable and return in an Array format. - updateUser() – This method takes 3 parameters – update id, field name, and new value.
Initialize $data Array with $field=>$value. Set where clause and execute update query.
Completed Code
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class UsersModel extends CI_Model {
// Fetch users
function getUsers(){
// Fetch users
$this->db->select('*');
$fetched_records = $this->db->get('users');
$users = $fetched_records->result_array();
return $users;
}
// Update record
function updateUser($id,$field,$value){
// Update
$data=array($field => $value);
$this->db->where('id',$id);
$this->db->update('users',$data);
}
}
4. Controller
Create a Users.php file in application/controllers/ directory.
Here, create 3 methods –
- __construct() – Load
UsersModelmodel andurlhelper. - index() – Get all users list by calling
getUsers()method and assign in$data['userlist']. Loaduser_viewview and pass$dataArray. - updateUser() – This method is used to handle AJAX request. Read POST values and pass in
updateUser()method to update record.
Completed Code
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Users extends CI_Controller {
public function __construct() {
parent::__construct();
// load model
$this->load->model('UsersModel');
// load base_url
$this->load->helper('url');
}
public function index(){
// get data
$data['userlist'] = $this->UsersModel->getUsers();
$this->load->view('user_view',$data);
}
public function updateuser(){
// POST values
$id = $this->input->post('id');
$field = $this->input->post('field');
$value = $this->input->post('value');
// Update records
$this->UsersModel->updateUser($id,$field,$value);
echo 1;
exit;
}
}
5. View
Create a user_view.php file in application/views/ directory.
Include the jQuery library in <head> section.
Create <table > to list user records.
Loop on the $userlist Array and add new <tr >. With <span class='edit' > display value and also add a textbox.
Use data attributes in the textbox to store editing field name and id.
Script
When <span class='edit' > element gets clicked then hide all textbox elements and show next textbox for edit. Hide the clicked <span >.
When focusout from textbox after editing then read the value of an element, edit id, and field name from data attribute.
Hide the textbox element and update the text of <span > and display it.
Send AJAX POST request to '<?= base_url() ?>index.php/users/updateuser', pass edit id, field name, and value as data.
Completed Code
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Live editable table with jQuery AJAX in CodeIgniter 3</title>
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<style type="text/css">
.txtedit{
display: none;
width: 98%;
}
</style>
</head>
<body>
<table width='100%' border='1' style='border-collapse: collapse;'>
<thead>
<tr>
<th width='50%'>Name</th>
<th width='50%'>Email</th>
</tr>
</thead>
<tbody>
<?php
// User List
foreach($userlist as $user){
$id = $user['id'];
$name = $user['name'];
$email = $user['email'];
echo "<tr>";
echo "<td>
<span class='edit' >".$name."</span>
<input type='text' class='txtedit' data-id='".$id."' data-field='name' id='nametxt_".$id."' value='".$name."' >
</td>";
echo "<td>
<span class='edit' >".$email."</span>
<input type='text' class='txtedit' data-id='".$id."' data-field='email' id='emailtxt_".$id."' value='".$email."' >
</td>";
echo "</tr>";
}
?>
</tbody>
</table>
<!-- Script -->
<script type="text/javascript">
$(document).ready(function(){
// On text click
$('.edit').click(function(){
// Hide input element
$('.txtedit').hide();
// Show next input element
$(this).next('.txtedit').show().focus();
// Hide clicked element
$(this).hide();
});
// Focus out from a textbox
$('.txtedit').focusout(function(){
// Get edit id, field name and value
var edit_id = $(this).data('id');
var fieldname = $(this).data('field');
var value = $(this).val();
// assign instance to element variable
var element = this;
// Send AJAX request
$.ajax({
url: '<?= base_url() ?>index.php/users/updateuser',
type: 'post',
data: { field:fieldname, value:value, id:edit_id },
success:function(response){
// Hide Input element
$(element).hide();
// Update viewing value and display it
$(element).prev('.edit').show();
$(element).prev('.edit').text(value);
}
});
});
});
</script>
</body>
</html>
6. Demo
7. Conclusion
You can also use ContentEditable attribute in a container to add inline data edit.
Read the values and send AJAX request to update the record.
If you found this tutorial helpful then don't forget to share.