<?php
//jQuery calls this code to save changes to inventory
if (isset($_POST['inventoryID'])){
//Filter all incoming fields
$attributeID = preg_replace('#[^0-9]#i', '', $_POST['attrID']);
$inventoryID = preg_replace('#[^0-9]#i', '', $_POST['inventoryID']);
$inventorySKU = preg_replace('#[^a-z0-9\-]#i', '', $_POST['inventorySKU']);
$inventorySize = preg_replace('#[^a-z0-9]#i', '', $_POST['inventorySize']);
$inventoryStock = preg_replace('#[^0-9]#i', '', $_POST['inventoryStock']);
$inventoryStatus = preg_replace('#[^a-z]#i', '', $_POST['inventoryStatus']);
//change letter case
$inventorySKU = strtoupper($inventorySKU);
$inventorySize = ucwords(strtolower($inventorySize));
//Check missing fields
if (!empty($inventorySKU) && !empty($inventorySize) && !empty($inventoryStock) && !empty($inventoryStatus)){
//Update row for product into table since there is no changes to image made
$sql = "UPDATE Inventory SET SKU = '$inventorySKU', Size = '$inventorySize', Stock = '$inventoryStock', Status = '$inventoryStatus' WHERE PK_InventoryID = '$inventoryID' AND FK_AttributesID = '$attributeID'";
$query = mysqli_query($connection, $sql);
if ($query){
echo 'Your inventory has been successfully updated!';
}else{
echo 'FAILURE: Inventory not updated!';
}
}
exit();
}
?>$(document).on('click', '#saveInvSubBtn', function() {
// Obtain the inventory and attribute ID
var iID = $('.deleteInvBtn').data("iid");
var attrID = $('.deleteInvBtn').data("attrid");
var form_data = new FormData();
form_data.append('inventorySKU', $("#invSKU").val());
form_data.append('inventorySize', $("#invSize").val());
form_data.append('inventoryStock', $("#invStock").val());
form_data.append('inventoryStatus', $("#invStatus").val());
$.ajax({
url: 'edit_inventory.php', // point to server-side PHP script
type: 'POST',
data: form_data,
dataType: 'text', // what to expect back from the PHP script
cache: false,
contentType: false,
processData: false,
success: function(data) { // display success(i.e, echo response) response from the PHP script
if (data === 'Your inventory has been successfully updated!') {
//do something
} else {
//do something else
}
},
error: function() { // display error response(i.e, server timeout etc) from the PHP script
//display error msg
}
});
});У меня есть div (состоящий из текстовых полей и кнопки сохранения), как показано ниже. Этот div воспроизводится скриптом PHP и является динамическим, т. е. он реплицирует себя столько раз, сколько необходимо в соответствии с циклом PHP WHILE с помощью функции эха. Div состоит из данных из таблицы. Если было 2 строки данных, div реплицирует себя дважды и т. д.
Чего я хочу добиться, так это того, что при нажатии кнопки сохранения jQuery должен получить атрибут данных класса кнопки «deleteInvBtn» и значения всех текстовых полей ВНУТРИ СВОЕГО СОБСТВЕННОГО DIV.
Это работает только при нажатии первой кнопки сохранения div. Когда нажимается вторая кнопка сохранения div, jQuery получает атрибут данных и значения текстовых полей из THE FIRST DIV, что мне не нужно. Я понимаю, что событие клика Jquery получает первый идентификатор, соответствующий HTML. Как мне это решить, пожалуйста? Напоминаем, что оба элемента div, показанные ниже или в реальном скрипте, состоят из одних и тех же классов или идентификаторов.
Я пробовал гуглить и искать, но безрезультатно. Я попытался прикрепить атрибут данных к самой кнопке и все еще не смог получить значения текстовых полей.
//This is Div 1
<div class = "flex-container-col">
<form onSubmit = "return false;">
<div>
<button class = "deleteInvBtn" data-iid = "5" data-attrid = "67"
title = "Delete Inventory">
<img src = "../images/bin.png" width = "100%"></button>
<label for = "invSKU">SKU</label>
<input type = "text" class = "form-text-no-border" id = "invSKU" value = "BSD-LALA40S">
</div>
<div>
<label for = "invSize">SIZE</label>
<input type = "text" class = "form-text-no-border" id = "invSize" value = "Small">
</div>
<div class = "flex-container-row">
<div class = "flex-col-50">
<label for = "invStock">STOCK</label>
<input type = "text" class = "form-text-no-border" id = "invStock" value = "11">
</div>
<div class = "flex-col-50">
<label for = "invStatus">STATUS</label>
<select class = "form-text-no-border" id = "invStatus">
//some option statement here
</select>
</div>
</div>
<div class = "flex-container-row">
<input type = "button" class = "form-btn" id = "saveInvSubBtn"
value = "SAVE">
</div>
</form>
</div>
//This is Div 2. Same as above but with diffrent values
<div class = "flex-container-col">
<form onSubmit = "return false;">
<div>
<button class = "deleteInvBtn" data-iid = "8" data-attrid = "84"
title = "Delete Inventory">
<img src = "../images/bin.png" width = "100%"></button>
<label for = "invSKU">SKU</label>
<input type = "text" class = "form-text-no-border" id = "invSKU" value = "KCD-GERA40S">
</div>
<div>
<label for = "invSize">SIZE</label>
<input type = "text" class = "form-text-no-border" id = "invSize" value = "Medium">
</div>
<div class = "flex-container-row">
<div class = "flex-col-50">
<label for = "invStock">STOCK</label>
<input type = "text" class = "form-text-no-border" id = "invStock" value = "31">
</div>
<div class = "flex-col-50">
<label for = "invStatus">STATUS</label>
<select class = "form-text-no-border" id = "invStatus">
//some option statement here
</select>
</div>
</div>
<div class = "flex-container-row">
<input type = "button" class = "form-btn" id = "saveInvSubBtn"
value = "SAVE">
</div>
</form>
</div>Когда нажата кнопка сохранения div 1, он должен получить атрибут данных div 1 «deleteInvBtn» и значение текстовых полей в div 1. Аналогичным образом, когда нажата кнопка сохранения div 2, он должен получить атрибут данных div 2 «deleteInvBtn» и текстовые поля значение в div 2.
Я согласен с тобой! Атрибуты данных на самом деле управляются php. Я буквально просто вставил число здесь для ясности






Вы можете сделать это, как показано ниже:
//try to give the button a specific class instead of .form-btn for this purpose
$('.form-btn').click(function(){
//from the clicked button find parent with type form then find id of the text field, then get the value.
alert($(this).parents('form').find('#invSKU').val());
//similarly for other elements.
alert($(this).parents('form').find('.deleteInvBtn').data('attrid'));
alert($(this).parents('form').find('.deleteInvBtn').data('iid'));
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
//This is Div 1
<div class = "flex-container-col">
<form onSubmit = "return false;">
<div>
<button class = "deleteInvBtn" data-iid = "5" data-attrid = "67"
title = "Delete Inventory">
<img src = "../images/bin.png" width = "100%"></button>
<label for = "invSKU">SKU</label>
<input type = "text" class = "form-text-no-border" id = "invSKU" value = "BSD-LALA40S">
</div>
<div>
<label for = "invSize">SIZE</label>
<input type = "text" class = "form-text-no-border" id = "invSize" value = "Small">
</div>
<div class = "flex-container-row">
<div class = "flex-col-50">
<label for = "invStock">STOCK</label>
<input type = "text" class = "form-text-no-border" id = "invStock" value = "11">
</div>
<div class = "flex-col-50">
<label for = "invStatus">STATUS</label>
<select class = "form-text-no-border" id = "invStatus">
//some option statement here
</select>
</div>
</div>
<div class = "flex-container-row">
<input type = "button" class = "form-btn" id = "saveInvSubBtn"
value = "SAVE">
</div>
</form>
</div>
//This is Div 2. Same as above but with diffrent values
<div class = "flex-container-col">
<form onSubmit = "return false;">
<div>
<button class = "deleteInvBtn" data-iid = "8" data-attrid = "84"
title = "Delete Inventory">
<img src = "../images/bin.png" width = "100%"></button>
<label for = "invSKU">SKU</label>
<input type = "text" class = "form-text-no-border" id = "invSKU" value = "KCD-GERA40S">
</div>
<div>
<label for = "invSize">SIZE</label>
<input type = "text" class = "form-text-no-border" id = "invSize" value = "Medium">
</div>
<div class = "flex-container-row">
<div class = "flex-col-50">
<label for = "invStock">STOCK</label>
<input type = "text" class = "form-text-no-border" id = "invStock" value = "31">
</div>
<div class = "flex-col-50">
<label for = "invStatus">STATUS</label>
<select class = "form-text-no-border" id = "invStatus">
//some option statement here
</select>
</div>
</div>
<div class = "flex-container-row">
<input type = "button" class = "form-btn" id = "saveInvSubBtn"
value = "SAVE">
</div>
</form>
</div>
Вам нужно будет добавить я бы на основе автоинкрементного числа (числа), полученного либо из базы данных, либо из вашего цикла. Покажите нам свой код PHP, чтобы мы могли вам помочь