8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,
J’ai changé la façon d’aller chercher mes listes en pompant un peux à droite et à gauche, je me permets d’en poser l’exemple fonctionnel ici, Même si je me doute que ce n’est certainement pas la meilleure façon de faire.
Maintenant je cherche à filtrer certaines colonnes de ma table « Objets ».
Clairement mon but serrait d’afficher une fenêtre dans la page PHP, qui permette de cocher les données de la table Objets, et de n’afficher que les données cochées.
Je suis preneur si quelqu’un a une piste sur la sélection de données à afficher.
A savoir, je ne veux pas écrire les données de la fenêtre à la main, je cherche à faire lister les données, en exclure les ID, et afficher les données cochées.
Récupération données -> sélection données -> envois de la requêtes des données sélectionnées -affiche des données
Je suis preneur pour toutes pistes sur ce sujet, merci d’avance

Appelles multiples dans DB et génération de listes déroulantes.
Pour cet exemple je suis parti sur des tables qui ne contiendrons pas plus de 99 chiffres, (à modifier selon besoins)
LA base
CREATE DATABASE test ;

Les 3 tables
CREATE TABLE Groupes (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    groupe_id INT(2) NOT NULL,
    groupe_nom VARCHAR(255)
);

INSERT INTO Groupes (groupe_id, groupe_nom) VALUES (03, 'Ok_Groupe_03');

CREATE TABLE Sous_Groupes (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    sous_groupe_groupe_id INT(2) NOT NULL,
    sous_groupe_id  INT(2) NOT NULL,
    sous_groupe_nom VARCHAR(255)
);

INSERT INTO Sous_Groupes (sous_groupe_groupe_id, sous_groupe_id, sous_groupe_nom) VALUES (03, 08,'Ok_S-Grp_08');

CREATE TABLE Objets (
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    objet_sous_groupe_id INT(2) NOT NULL,
    objet_id  INT(2) NOT NULL,
    objet_nom VARCHAR(255),
    donnée_1  INT(2) NOT NULL,
    donnée_2  INT(2) NOT NULL,
    donnée_3  INT(2) NOT NULL
);

INSERT INTO Objets (objet_sous_groupe_id, objet_id, objet_nom, donnée_1, donnée_2, donnée_3) VALUES (08,01,'Ok_Obj_01',23, 12, 14);

Le fichier php (index.php, par exemple)

Le fichier php (index.php, par exemple)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
    <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
    <style type="text/css">
        .f1{
            display: flex;
            flex-direction: column;
            margin-top: 100px;
            width: 290px;
        }
        .select{
            margin-top: 5px;
        }

    </style>
</head>
<body>


<form class="f1" method="post">

    <label for="groupe">groupe :</label><select name="groupe" id="groupe" required></select>

    <label for="sous_groupe">sous_groupe :</label><select name="sous_groupe" id="sous_groupe" required></select>

    <label for="objet">objet :</label><select name="objet" id="objet" required></select>

    <input type="submit" value="Envoyer" />

</form>

 

<script>

    $(function () {

        // dès le chargement de la page, on remplit la liste des groupe

        remplirgroupe();

 

        // lorsque le groupe sera changé dans la liste, on charge la liste des sous_groupes ou états correspondants

        $("#groupe").change(function (event) {

            remplirsous_groupes();

        });


        // lorsque sous_groupe sera changé dans la liste, on charge la liste des objets ou états correspondants

        $("#sous_groupe").change(function (event) {

            remplirobjet();

        });

    });

 

    function remplirgroupe() {
       

    var jqxhr = $.ajax({

            type: 'get', // on n'a pas de paramètres à envoyer alors GET est sécuritaire

            url: 'generer-options-groupe.php',

            dataType: "html", // le fichier php fait un echo de code HTML

            contentType: "application/x-www-form-urlencoded; charset=UTF-8",

            data: ""

        })

        .done(function (response, textStatus, jqXHR) {

            // Appel réussi : on affiche le code HTML généré par le code serveur

            if ("REQUETE" == response) {

                $("#groupe").html("<option value=''>Un problème technique nous empêche de retrouver les groupe (code R).</option>");

            }

            else {

                $("#groupe").html("<option value=''>Veuillez choisir...</option>" + response);

            }

        })

    }

 

    function remplirsous_groupes() {

        var groupe = $('#groupe').val();
//verbose consol
       

        var dataString = 'groupe=' + groupe;

 

        var jqxhr = $.ajax({

            type: 'post',

            url: 'generer-options-sous_groupes.php',

            dataType: "html", // le fichier php fait un echo de code HTML

            contentType: "application/x-www-form-urlencoded; charset=UTF-8",

            data: dataString

        })

        .done(function (response, textStatus, jqXHR) {

            // Appel réussi : on affiche le code HTML généré par le code serveur

            if ("PARAMETRE" == response) {

                $("#sous_groupe").html("<option value=''>Le groupe sélectionné n'est pas valide.</option>");

            }

            else {

                $("#sous_groupe").html("<option value=''>Veuillez choisir...</option>" + response);

            }

        })


    }



     function remplirobjet() {

        var sous_groupe = $('#sous_groupe').val();

        

        var dataString = 'sous_groupe=' + sous_groupe;

 

        var jqxhr = $.ajax({

            type: 'post',

            url: 'generer-options-objet.php',

            dataType: "html", // le fichier php fait un echo de code HTML

            contentType: "application/x-www-form-urlencoded; charset=UTF-8",

            data: dataString

        })

        .done(function (response, textStatus, jqXHR) {

            // Appel réussi : on affiche le code HTML généré par le code serveur

            if ("PARAMETRE" == response) {

                $("#objet").html("<option value=''>Le groupe sélectionné n'est pas valide.</option>");

            }


            else {

                $("#objet").html("<option value=''>Veuillez choisir...</option>" + response);

            }

        })

    }

 

</script>

</body>
</html>

Le fichier qui va appeler la 1ere table qui contient les Groupes
Dans cet exemple il doit se nommer :
generer-options-groupe.php
<?php
// connexion à la base de données
$mysqli = new mysqli("localhost", "Utilisateur", "MotDePasse", "Nom_De_Base");

// requête pour récupérer les groupe
$requete = "SELECT groupe_id, groupe_nom FROM Groupes ORDER BY groupe_nom";

$resultat = $mysqli->query($requete); // exécution de la requête

if ($resultat && $resultat->num_rows > 0) { // s'il y a des résultats

    $options = ""; // initialisation des options pour le select

    while ($row = $resultat->fetch_assoc()) { // boucle pour récupérer les données de chaque ligne

        $options .= "<option value='{$row['groupe_id']}'>{$row['groupe_nom']}</option>"; // ajout des options au résultat

    }

    echo $options; // envoi des options en réponse

} else {

    echo "AUCUNEDONNEE"; // pas de données retournées par la requête

}

// fermeture de la connexion
$mysqli->close();
?>

Le fichier qui va appeler la 2ème table qui contient les Sous_Groupes
Dans cet exemple il doit se nommer :
generer-options-sous_groupes.php
<?php
// Connexion à la base de données
$mysqli = new mysqli("localhost", "Utilisateur", "MotDePasse", "Nom_De_Base");

// Vérifie si les données nécessaires ont été reçues en paramètre
if (!isset($_POST['groupe']) || $_POST['groupe'] == '') {
    echo "PARAMETRE";
    exit;
}

// Récupère l'identifiant du groupe sélectionné
$groupe = intval($_POST['groupe']);

// Recherche si l'identifiant du groupe existe dans la BD
$stmt = $mysqli->prepare("SELECT groupe_nom FROM Groupes WHERE groupe_id = ?");
$stmt->bind_param("i", $groupe);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows == 0) {
    echo "PARAMETRE";
    exit;
}

// Récupère les sous_groupes correspondantes au groupe sélectionné
$stmt = $mysqli->prepare("SELECT sous_groupe_id, sous_groupe_nom FROM Sous_Groupes WHERE sous_groupe_groupe_id = ? ORDER BY sous_groupe_nom");
$stmt->bind_param("i", $groupe);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows == 0) {
    echo "AUCUNEDONNEE";
    exit;
}

// Génère les balises <option> correspondantes aux sous_groupes trouvées
$stmt->bind_result($sous_groupe_id, $sous_groupe_nom);
$retour = "";
while ($stmt->fetch()) {
    $retour .= "<option value='$sous_groupe_id'>$sous_groupe_nom</option>";
}

echo $retour;
// fermeture de la connexion
$mysqli->close();
?>

Le fichier qui va appeler la 3ème table qui contient la liste les Objets recherchées
Dans cet exemple il doit se nommer :
generer-options-objet.php
<?php
// Connexion à la base de données
$mysqli = new mysqli("localhost", "Utilisateur", "MotDePasse", "Nom_De_Base");

// Vérifie si les données nécessaires ont été reçues en paramètre
if (!isset($_POST['sous_groupe']) || $_POST['sous_groupe'] == '') {
    echo "PARAMETRE";
    exit;
}

// Récupère l'identifiant du sous_groupe sélectionné
$sous_groupe = intval($_POST['sous_groupe']);

// Recherche si l'identifiant du sous_groupe existe dans la BD
$stmt = $mysqli->prepare("SELECT sous_groupe_nom FROM Sous_Groupes WHERE sous_groupe_id = ?");
$stmt->bind_param("i", $sous_groupe);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows == 0) {
    echo "PARAMETRE";
    exit;
}

// Récupère les objets correspondantes au sous_groupe sélectionné
$stmt = $mysqli->prepare("SELECT objet_id, objet_nom FROM Objets WHERE objet_sous_groupe_id = ? ORDER BY objet_nom");
$stmt->bind_param("i", $sous_groupe);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows == 0) {
    echo "AUCUNEDONNEE";
    exit;
}

// Génère les balises <option> correspondantes aux objets trouvées
$stmt->bind_result($objet_id, $objet_nom);
$retour = "";
while ($stmt->fetch()) {
    $retour .= "<option value='$objet_id'>$objet_nom</option>";
}

echo $retour;
// fermeture de la connexion
$mysqli->close();
?>

Modifié par uniuc (03 May 2023 - 20:20)
Salut,
Effectivement en regardant d’un peut plus près ça pourrais coller pour les deux premier appelles groupe et sous-groupes, mais quand je vais arriver à la liste des noms qui va pouvoir parfois contenir des centaines d’items là ça va se corser, remarque je n’en suis pas là, je n’arrive déjà pas à appeler deux listes proprement qui ne contiennes que deux items chacune. En même temps en quatre jours sur du PHP, j’ai bien conscience que je ne vais pas faire de miracles.

C’est pour ça qu’a la base je suis parti sur des appelles basés sur les titres de mes colonnes :

Nom de la base -> noms des tables -> sous-groupe de la table choisie -> affichage de colonne nom -> filtrage des colonnes de l’item -> affichage des colonnes voulues.

En gros voila ce que je cherche à faire. Mais dès qu’on passe le stade des sous-groupes, je vais être à plus de 80 données par item.

Et mon plus gros problème n’est pas tant l’esthétique pour le moment, mais de comprendre comment faire trois appelles de suites en cascades sur la base de données.

- noms des tables -> sous-groupe de la table choisie -> affichage de colonne nom dans une troisième liste déroulante.

En tout cas je te remercie pour ton info, je vais me pencher dessus pour l’affichage de mes deux premiers appelles.