多个下拉冲突php mysql

问题描述 投票:0回答:1

我有 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);
?>

php mysql
1个回答
0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.