我有 3 个从数据库自动填充的下拉列表。输入 achat /categorie/article。在 achat 类型中有 2 个选项:物料/服务。当我选择物资时,它会显示可供服务的物资类别列表。当我从材料中选择一个类别时,它会正确列出其中的所有文章,但是当我从服务中选择类别元素时,它会显示材料中的文章。我不知道错误在哪里。这是我的三个文件:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Nouvelle Demande d'Achat</title>
</head>
<body>
<h2>Nouvelle Demande d'Achat</h2>
<form id="achatForm">
<div class="form-group">
<label for="typeAchat">Type d'Achat :</label>
<select class="form-control" id="typeAchat">
<option value="">Sélectionner un type d'achat</option>
<?php
// Connexion à la base de données 'dac'
$conn = mysqli_connect("localhost", "casablanca", "casablanca", "dac");
// Vérifier la connexion
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// Requête pour obtenir les types d'achat
$queryTypeAchat = "SELECT * FROM type_achat";
$resultTypeAchat = mysqli_query($conn, $queryTypeAchat);
while ($row = mysqli_fetch_assoc($resultTypeAchat)) {
echo '<option value="' . $row['id_type_achat'] . '">' . $row['nom_type_achat'] . '</option>';
}
// Fermer la connexion
mysqli_close($conn);
?>
</select>
</div>
<div class="form-group" id="categoriesGroup" style="display: none;">
<label for="categorieSelect">Catégorie :</label>
<select class="form-control" id="categorieSelect"></select>
</div>
<div class="form-group" id="articlesGroup" style="display: none;">
<label for="articleSelect">Article ou Service :</label>
<select class="form-control" id="articleSelect"></select>
</div>
<input type="submit" value="Soumettre">
</form>
<script>
document.getElementById('typeAchat').addEventListener('change', function() {
var typeAchat = this.value;
if (typeAchat !== '') {
document.getElementById('categoriesGroup').style.display = 'block';
// Requête AJAX pour charger les catégories correspondantes
var xhr = new XMLHttpRequest();
xhr.open('POST', 'load_categories.php', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status === 200) {
document.getElementById('categorieSelect').innerHTML = xhr.responseText;
document.getElementById('articlesGroup').style.display = 'none';
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send('typeAchat=' + typeAchat);
} else {
document.getElementById('categoriesGroup').style.display = 'none';
document.getElementById('articlesGroup').style.display = 'none';
}
});
document.getElementById('categorieSelect').addEventListener('change', function() {
var categorieId = this.value;
if (categorieId !== '') {
// Requête AJAX pour charger les articles correspondants
var xhr = new XMLHttpRequest();
xhr.open('POST', 'load_articles.php', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
if (xhr.status === 200) {
document.getElementById('articleSelect').innerHTML = xhr.responseText;
document.getElementById('articlesGroup').style.display = 'block';
} else {
console.error('Request failed. Status: ' + xhr.status);
}
};
xhr.send('categorieId=' + categorieId);
} else {
document.getElementById('articlesGroup').style.display = 'none';
}
});
</script>
</body>
</html>
load_categories.php
<?php
// Connexion à la base de données 'dac'
$conn = mysqli_connect("localhost", "casablanca", "casablanca", "dac");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
if (isset($_POST['typeAchat'])) {
$typeAchat = $_POST['typeAchat'];
// Requête pour récupérer les catégories en fonction du type d'achat (materiel ou service)
$query = "SELECT * FROM categorie_materiels WHERE id_type_achat = $typeAchat";
$result = mysqli_query($conn, $query);
$options = '<option value="">Sélectionner une catégorie</option>';
while ($row = mysqli_fetch_assoc($result)) {
$options .= '<option value="' . $row['id_categorie_materiels'] . '">' . $row['nom_categorie_materiels'] . '</option>';
}
// Ajouter les catégories de service en fonction du type d'achat
$queryService = "SELECT * FROM categorie_services WHERE id_type_achat = $typeAchat";
$resultService = mysqli_query($conn, $queryService);
while ($row = mysqli_fetch_assoc($resultService)) {
$options .= '<option value="' . $row['id_categorie_services'] . '">' . $row['nom_categorie_services'] . '</option>';
}
echo $options;
}
mysqli_close($conn);
?>
load_articles.php
<?php
// Connexion à la base de données 'dac'
$conn = mysqli_connect("localhost", "casablanca", "casablanca", "dac");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
if (isset($_POST['categorieId'])) {
$categorieId = $_POST['categorieId'];
// Vérifier si la catégorie est associée à du matériel
$queryMaterial = "SELECT * FROM categorie_materiels WHERE id_categorie_materiels = $categorieId";
$resultMaterial = mysqli_query($conn, $queryMaterial);
if (mysqli_num_rows($resultMaterial) > 0) {
// Requête pour récupérer les articles de la catégorie de matériel
$query = "SELECT * FROM materiel WHERE id_categorie_materiel = $categorieId";
$result = mysqli_query($conn, $query);
$options = '<option value="">Sélectionner un article</option>';
while ($row = mysqli_fetch_assoc($result)) {
$options .= '<option value="' . $row['id_materiel'] . '">' . $row['nom_materiel'] . '</option>';
}
} else {
// Requête pour récupérer les services de la catégorie
$queryService = "SELECT * FROM service WHERE id_categorie_services = $categorieId";
$resultService = mysqli_query($conn, $queryService);
$options = '<option value="">Sélectionner un service</option>';
while ($row = mysqli_fetch_assoc($resultService)) {
$options .= '<option value="' . $row['id_service'] . '">' . $row['nom_service'] . '</option>';
}
}
echo $options;
}
mysqli_close($conn);
?>
在
typeAchat
下拉列表中,某些选项使用 id_materiel
作为值,其他选项使用 id_service
。但没有什么可以阻止每个表中的行具有相同的 ID。所以当你将ID发送到load_articles
时,它无法知道它来自哪张表。您需要向该值添加一些内容以指定它来自哪个表。您可以将其作为前缀放入值中。
load_categories.php
<?php
// Connexion à la base de données 'dac'
$conn = mysqli_connect("localhost", "casablanca", "casablanca", "dac");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
if (isset($_POST['typeAchat'])) {
$typeAchat = $_POST['typeAchat'];
// Requête pour récupérer les catégories en fonction du type d'achat (materiel ou service)
$query = "SELECT * FROM categorie_materiels WHERE id_type_achat = $typeAchat";
$result = mysqli_query($conn, $query);
$options = '<option value="">Sélectionner une catégorie</option>';
while ($row = mysqli_fetch_assoc($result)) {
$options .= '<option value="materiel-' . $row['id_categorie_materiels'] . '">' . $row['nom_categorie_materiels'] . '</option>';
}
// Ajouter les catégories de service en fonction du type d'achat
$queryService = "SELECT * FROM categorie_services WHERE id_type_achat = $typeAchat";
$resultService = mysqli_query($conn, $queryService);
while ($row = mysqli_fetch_assoc($resultService)) {
$options .= '<option value="service-' . $row['id_categorie_services'] . '">' . $row['nom_categorie_services'] . '</option>';
}
echo $options;
}
mysqli_close($conn);
然后从
load_articles.php
中的值中提取该值
if (isset($_POST['categorieId'])) {
[$typeAchat, $categorieId] = explode('-', $_POST['categorieId']);
if ($typeAchat == 'materiel') {
// Requête pour récupérer les articles de la catégorie de matériel
$query = "SELECT * FROM materiel WHERE id_categorie_materiel = $categorieId";
$result = mysqli_query($conn, $query);
$options = '<option value="">Sélectionner un article</option>';
while ($row = mysqli_fetch_assoc($result)) {
$options .= '<option value="' . $row['id_materiel'] . '">' . $row['nom_materiel'] . '</option>';
}
} elseif ($typeAchat == 'service') {
// Requête pour récupérer les services de la catégorie
$queryService = "SELECT * FROM service WHERE id_categorie_services = $categorieId";
$resultService = mysqli_query($conn, $queryService);
$options = '<option value="">Sélectionner un service</option>';
while ($row = mysqli_fetch_assoc($resultService)) {
$options .= '<option value="' . $row['id_service'] . '">' . $row['nom_service'] . '</option>';
}
} else {
$options = '<option value="">Nothing to select</option>';
}
echo $options;
}
mysqli_close($conn);