Отправить несколько входов, созданных циклом while, в PHP

Моя проблема в том, что я создал корзину продуктов, которые сохраняются в базе данных, затем я создал 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 = в начале просто опечаткой здесь, на SO, или это ваш настоящий код? $("input[name='cantidad']") будет соответствовать каждому вводу на странице, а .val() из этого набора вернет только значение первого.

Don't Panic 30.04.2023 13:43

Я уже добавил, как вызывается функция Datos(), и о $id =, это был какой-то код, который я забыл удалить, когда искал способы решить свою проблему. И уважайте, что .val() вернет только значение первого значения, есть идеи о том, как отправлять/возвращать значение каждого сгенерированного ввода? Спасибо, что прочитали это.

Paul 30.04.2023 16:10

У вас сейчас довольно много проблем. 1) Все ваши input имеют одинаковые name, что означает, что все они перезапишут друг друга, и только 1 из них будет отправлен в ваш сервер. Вы могли видеть это, если вы print_r($_POST); в своем PHP. Вам нужно передать значения в виде массива и перебрать их, вот пример.

Don't Panic 01.05.2023 08:40

2) Теперь у вас есть набор количественных значений на бэкэнде, но нет ничего, что связывало бы эти значения с каким-либо конкретным элементом в вашей БД. Вам нужно количество и идентификатор продукта, для которого это количество. Вы можете либо добавить скрытый ввод для каждого ввода количества, который включает идентификатор продукта, либо, что проще, использовать идентификатор продукта в качестве ключа входного массива (пример).

Don't Panic 01.05.2023 08:47

3) Вам нужны данные из всей формы на задней панели, а не отдельные значения, поэтому вы хотите отправить всю форму. Нет необходимости в переменной v1 в Javascript — просто отправьте форму.

Don't Panic 01.05.2023 08:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вам нужно перебрать объект, возвращаемый селектором $("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: таким образом вы можете умножать цену каждой книги на количество выбранных книг, делая пересечение с выбранными книгами и их цены считываются из БД (используя несколько запросов или сравнение массивов)

Другие вопросы по теме