Consider the following code.
function editData(i, t, c) {
if (i === undefined || t === undefined || c === undefined) {
return false;
}
$.ajax({
url: "edit.php",
method: "POST",
data: {
id: i,
text: t,
column_name: c
},
dataType: "text",
success: function(d) {
console.log("Success:", d);
},
error: function(xhr, txt, err) {
console.log("AJAX Error: ", xhr, txt, err);
}
});
}
function updateData(i) {
if (i === undefined) {
return false;
}
var $items = $("tr[data-row-id='" + i + "'] input");
var myData = {
id: i
};
$item.each(function(ind, el) {
myData[$(el).attr("class")] = $(el).val();
});
$.ajax({
url: "update.php",
method: "POST",
data: myData,
dataType: "text",
success: function(d) {
console.log("Success:", d);
fetch_data();
},
error: function(xhr, txt, err) {
console.log("AJAX Error: ", xhr, txt, err);
}
});
}
$(function() {
var $dt = $("#data-table");
$dt.on('blur', 'input', function(e) {
editData($(this).parent().parent().data("row-id"), $(this).val(), $(this).attr("class"));
});
$dt.on('click', '.btn_update', function(e) {
e.preventDefault();
if (confirm("Are you sure you want to update this?")) {
updateData($(this).parent().parent().data("row-id"));
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="data-table">
<thead>
<tr>
<th>First Name</th>
<th colspan="2">Last Name</th>
</tr>
</thead>
<tr data-row-id="1001">
<td><input type="text" class="firstName" value="Homer" /></td>
<td><input type="text" class="lastName" value="Simpson" />
</td>
<td><button class="btnUpdate">Update</button></td>
</table>
This may help you streamline your code. It was not clear what your Update Button was going to do, and since I do not know what your PHP scripts are doing, it's hard to anticipate what you are trying to accomplish.
Since you did not provide a MCVE, I was unable to test the code for proper functionality. But using console can allow you a lot more detail without disrupting the User interaction. An alert box requires clicking the Button to proceed which can alter the interactions.
You do not have to use a <table>, a parent <div> can also work, but it's helpful to have something that can be a container for the data that is associated with the id. I assigned the id to each row to make it easier to address. I assume your Database table holds data like so:
+---------------------------+
| ID | firstName | lastName |
+---------------------------+
| 1 | Homer | Simpson |
| 2 | Marge | Simpson |
| 99 | Moe | Szyslak |
+---------------------------+
Therefore, it does not make sense to retain the ID in each <input> if possible. It's really up to you, since it's not clear what the HTML looks like, again if you provide a more complete example, people can help further.
I also suspect you'd need to update your update.php to handle the new stream of data.
update.php
<?php
$cn = array();
foreach($_POST as $k => $v){
if($k == 'id'){
continue;
}
array_push($cn, $k);
}
include_once 'mysqli_connect.php';
$id = $mysqli->real_escape_string($_POST['id']);
$sql = "UPDATE table_name SET ";
foreach($cn as $col){
$val = $mysqli->real_escape_string($_POST[$col]);
$sql .= "$col = '$val',";
}
$sql = substr($sql, 0, -1) . " WHERE id = $id;";
// Execute SQL Query
?>
This will update each column for the row with whatever data was sent in. You may also consider making use of JSON to pass the data to PHP.
blurevent on the next field. Sort of creating a loop.