Моя проблема в том, что я создал корзину продуктов, которые сохраняются в базе данных, затем я создал while для печати информации о продукте (название, жанр, цена), а затем количество продуктов, которые вы хотите купить.
Проблема в том, что считывается только один из нескольких созданных входных данных и вычисляется с этим количеством вместо каждого созданного. Поэтому я рад, если вы можете помочь мне исправить часть кода, которая вызывает проблему.
Извините, если что-то непонятно, это мой первый пост здесь.
Вот коды.
Файл PHP, который печатает информацию:
<tbody>
<tr>
<?php
$conexion = mysqli_connect("localhost", "root", "", "llanoponte");
$sql = "SELECT * FROM libros";
$resultado = $conexion->query($sql);
$x = 0;
if ($resultado->num_rows > 0) {
while ($row = $resultado->fetch_assoc()) {
$valor = $row['Precio'];
echo "<td>", $row['Titulo'], "</td>
<td>", $row['Autor'], "</td>
<td>", $row['Genero'], "</td>
<td>", $valor, " €", "</td>
<td>", "<input type='number' name='cantidad' class='cantidad' value='0' id='<?php echo $x ?>'>", "</td>
</tr>";
$x++;
}
} else {
echo "Sin resultados";
}
$conexion->close();
?>
</tr>
</tbody>
Вот кнопка для вызова функции
<input type = "button" name = "actualizar" class = "calcular" onclick = "Datos()" id = "boton1" value = "Calcular">
Скрипт, который отправляет вставленное количество в файл PHP, выполняющий операцию:
function Datos() {
v1 = $("input[name='cantidad']").val();
$.ajax({
url: 'total.php',
type: 'post',
data: {cantidad: v1},
success: function (respuesta) {
$('#resultados').html(respuesta);
}
})
}
PHP, который вычисляет итог и возвращает значение принципалу:
include('conexiones.php');
$multi1 = $_POST['cantidad'];
$conexion = mysqli_connect("localhost", "root", "", "llanoponte");
$sql = "SELECT * FROM libros";
$resultado = $conexion->query($sql);
if ($resultado->num_rows > 0) {
$total = 0;
while ($row = $resultado->fetch_assoc()) {
$total = ($row['Precio'] * $multi1) + $total;
}
echo '<p>', $total, ' € ', '</p>';
} else {
echo 'Sin resultados';
}
$conexion->close();
И здесь должна появиться общая цена
<div class = "texto2">
<h1>Total</h1>
<div id = "resultados">
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
</div>
</div
Я попытался изменить идентификаторы на элемент, значение которого будет увеличиваться с каждым циклом цикла while, но затем я столкнулся с препятствием отправки входных данных и их значений на другой PHP через скрипт. И даже пытаясь перейти от получения значения от элемента с определенным идентификатором к имени, он все равно фиксирует значение первого созданного ввода, а не остальных.
Я уже добавил, как вызывается функция Datos(), и о $id =, это был какой-то код, который я забыл удалить, когда искал способы решить свою проблему. И уважайте, что .val() вернет только значение первого значения, есть идеи о том, как отправлять/возвращать значение каждого сгенерированного ввода? Спасибо, что прочитали это.
У вас сейчас довольно много проблем. 1) Все ваши input имеют одинаковые name, что означает, что все они перезапишут друг друга, и только 1 из них будет отправлен в ваш сервер. Вы могли видеть это, если вы print_r($_POST); в своем PHP. Вам нужно передать значения в виде массива и перебрать их, вот пример.
2) Теперь у вас есть набор количественных значений на бэкэнде, но нет ничего, что связывало бы эти значения с каким-либо конкретным элементом в вашей БД. Вам нужно количество и идентификатор продукта, для которого это количество. Вы можете либо добавить скрытый ввод для каждого ввода количества, который включает идентификатор продукта, либо, что проще, использовать идентификатор продукта в качестве ключа входного массива (пример).
3) Вам нужны данные из всей формы на задней панели, а не отдельные значения, поэтому вы хотите отправить всю форму. Нет необходимости в переменной v1 в Javascript — просто отправьте форму.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, вам нужно перебрать объект, возвращаемый селектором $("input[name='cantidad']"), и поместить каждое значение в массив, который будет передан вызову ajax ::
let data = [];
$("input[name='cantidad']").each((k, v) => data.push(v.value));
Таким другим способом вы также можете взять идентификаторы:
let data = [];
$("input[name='cantidad']").each((k, v) => {let o = {}; o[v.id] = v.value; data.push(o);});
И я рекомендую вам назначать входным id первичный ключ записей вместо назначения счетчика $x: таким образом вы можете умножать цену каждой книги на количество выбранных книг, делая пересечение с выбранными книгами и их цены считываются из БД (используя несколько запросов или сравнение массивов)
Как называется
Datos()? Является ли$id =в начале просто опечаткой здесь, на SO, или это ваш настоящий код?$("input[name='cantidad']")будет соответствовать каждому вводу на странице, а.val()из этого набора вернет только значение первого.