我在为不同的订单创建表格时遇到了一个问题,他们各自的产品和产品准备复选框。
我使用一个循环创建了按钮,该循环将调用一个函数来检查复选框并将 SQL 命令发送到数据库。但是,当有多个不同订单ID的订单,但所有按钮显示相同的订单ID和产品总数时,问题就来了。
结果,SQL 命令被发送到相同的项目,即使由于遍历订单 ID 和产品数组的循环,代码中的订单 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);
?>
您遇到的问题与所有复选框和按钮具有相同 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();
}
这样就可以唯一标识每个checkbox,从类名中得到order ID和product ID,可以在SQL查询中使用。