javascript 如何使用从循环生成的按钮来调用具有更改参数的函数?

46scxncf  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(94)

我面临着一个问题,而创建不同的订单与各自的产品和复选框的产品准备表。
我使用一个循环创建了按钮,该循环将调用一个函数来选中复选框并将SQL命令发送到数据库。然而,当有多个订单具有不同的订单ID,但所有按钮显示相同的订单ID和产品总量时,问题就来了。
因此,即使订单ID和产品总量在代码中发生了变化,SQL命令也会被发送到同一个项目,因为循环遍历了订单ID和产品的数组。
我无法在互联网上找到任何解决方案。我甚至尝试使用ChatGPT,但它无法解决我的问题。
我希望能为我的问题提供一些帮助。
index.php

<?php
    require_once "process_orders.php";
?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Commande Client</title>
        <link rel="stylesheet" href="style.css">
        <script src="myscripts.js"></script>
    </head>

    <body>
        <?php
        if ($number_of_orders == 0)
        {
            ?>

            <h1>Aucun panier en cours</h1>

            <?php
        }
        else
        {
            ?>

            <h1>Traitement des paniers</h1>

            <?php

            for ($i = 0; $i < $number_of_orders; $i++) 
            {
                ?>
                <table>
                    <tr>
                        <th colspan="3"><?php echo $customerOrder[$i]->getName(); ?></th>
                    </tr>
                    <tr>
                        <th>Produit</th>
                        <th>Quantité</th>
                        <th><?php echo $customerOrder[$i]->getOrder_date(); ?></th>
                    </tr>
                    <?php

                    for ($j = 0; $j < $customerOrder[$i]->getTotalProducts(); $j++)
                    {
                        $product_name = $customerOrder[$i]->getProductName($j);
                        $customer_products_quantity = $customerOrder[$i]->getProductQuantity($j);
                    
                        ?>
                        <tr>
                            <td><?php echo $product_name; ?></td>
                            <td><?php echo $customer_products_quantity; ?></td>
                            <td><input type="checkbox" name="<?php echo $customerOrder[$i]->getOrder_id();?>"  value="<?php echo $customerOrder[$i]->getProductId($j);?>" id=<?php echo $j?> <?php if($customerOrder[$i]->getProductAvailable($j)) { echo "checked"; } ?>></td>
                        <?php
                    }
                    ?>
                    
                    <tr>
                        <th colspan="3">
                            <button onclick="updateNonManquant(<?php echo $customerOrder[$i]->getOrder_id() ?>, <?php echo $customerOrder[$i]->getTotalProducts() ?>)">Valider</button> <!-- HERE IS THE PROBLEM -->
                        </th>
                    </tr>
                </table>
                
                <br> <br>
                <?php
            }
        }
        ?> 
    </body>
</html>

js文件

function updateNonManquant(order_id, totalProducts) {
    for (let i = 0; i < totalProducts; i++) {
        var xhr = new XMLHttpRequest();

        var url = "db_query.php";
        var sql;

        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var results = JSON.parse(this.responseText);
            }
        };

        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/json");

        var checkbox = document.getElementById(i);
        var id_Products = checkbox.value;
        var button_name = checkbox.name;
        
        alert(button_name + " " + order_id);

        if (button_name == order_id) {
            if (checkbox.checked) {
                sql = `UPDATE article SET non_manquant = 1 WHERE id = ${id_Products} AND num_commande = ${order_id}`;

                xhr.send(JSON.stringify({sql: sql}));
            } else {     
                sql = `UPDATE article SET non_manquant = 0 WHERE id = ${id_Products} AND num_commande = ${order_id}`;
                
                xhr.send(JSON.stringify({sql: sql}));
            }
            alert(id_Products);
        }
    }
    location.reload();
}

db_query文件

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "site_e-commerce";

$sql = json_decode(file_get_contents("php://input"))->sql;

$link = mysqli_connect($servername, $username, $password, $dbname);
$result = mysqli_query($link, $sql);

if ($result) {
    echo "SQL command executed successfully!";
} else {
    echo "Error executing SQL command: " . mysqli_error($link);
}

mysqli_close($link);
?>

items in the database

tez616oj

tez616oj1#

您面临的问题与所有复选框和按钮具有相同ID的事实有关,这使得在JavaScript函数中难以区分它们。要解决此问题,您可以尝试以下解决方案:
不使用ID属性,而是使用class属性来标识循环中的复选框,并根据它们的订单和产品ID为它们指定一个唯一的类名。您可以使用订单ID和产品ID的串联作为类名,例如:

<input type="checkbox" name="<?php echo $customerOrder[$i]->getOrder_id();?>" value="<?php echo $customerOrder[$i]->getProductId($j);?>" class="<?php echo $customerOrder[$i]->getOrder_id() . '-' . $customerOrder[$i]->getProductId($j); ?>" <?php if($customerOrder[$i]->getProductAvailable($j)) { echo "checked"; } ?>>

在JavaScript函数中,使用类选择器而不是ID选择器来获取复选框,并使用订单ID和产品ID来构造类名:

function updateNonManquant(order_id, totalProducts) {
    for (let i = 0; i < totalProducts; i++) {
        var xhr = new XMLHttpRequest();

        var url = "db_query.php";
        var sql;

        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                var results = JSON.parse(this.responseText);
            }
        };

        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/json");

        var checkbox = document.getElementsByClassName(order_id + '-' + (i+1))[0];
        var id_Products = checkbox.value;
        var button_name = checkbox.name;
        
        alert(button_name + " " + order_id);

        if (button_name == order_id) {
            if (checkbox.checked) {
                sql = `UPDATE article SET non_manquant = 1 WHERE id = ${id_Products} AND num_commande = ${order_id}`;

                xhr.send(JSON.stringify({sql: sql}));
            } else {     
                sql = `UPDATE article SET non_manquant = 0 WHERE id = ${id_Products} AND num_commande = ${order_id}`;
                
                xhr.send(JSON.stringify({sql: sql}));
            }
            alert(id_Products);
        }
    }
    location.reload();
}

这样,您就可以唯一地标识每个复选框,并从类名中获取订单ID和产品ID,这可以在SQL查询中使用。

相关问题