IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Données entre colonnes de différentes tables (PHP /MySQL)


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut Données entre colonnes de différentes tables (PHP /MySQL)
    Bonjour.

    Je sollicite votre aide au sujet d'une opération que je souhaiterais faire, concernant deux tables (operateurs, taches) d'une même BDD MySQL.

    Chacune contient une colonne charge_hebdo.

    taches.charge_hebdo est le résultat de l'addition de trois autres colonnes de cette même table : elle est ainsi auto-générée.

    AInsi operateurs.charge_hebdo doit avoir, de façon automatique, le même résultat que taches.charge_hebdo, pour un même id représentant donc un même opérateur sur les deux tables. Seule la charge_hebdo change selon ces différents opérateurs.

    Vu que j'affiche un tableau en PHP qui reprend toutes ces données, selon vous, comment puis-je procéder, pour recevoir automatiquement le résultat de taches.charge_hebdo dans ma colonne operateurs.charge_hebdo ?

    Pour information, elles ne peuvent pas être placées dans la même table.


    Pour plus d'informations, voici le code :
    tableau pour la table operateurs
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <!-- Création de la vue du tableau -->
                            <div class="card-body">
                                <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                    <thead>
                                        <tr>
                                            <th class="text-center">ID</th>
                                            <th class="text-center">Identité</th>
                                            (...)
                                            <th class="text-center">Charge hebdomadaire</th>
                                            <th></th>
                                            <th></th>
                                        </tr>
                                    </thead>
     
                                    <tbody>
                                        <?php
                                        // On récupère les données contenues dans la BDD
                                            $query = "SELECT * FROM operateurs ORDER BY id ASC";
                                            $statement = $conn->prepare($query);
                                            $statement->execute();
                                            $statement->setFetchMode(PDO::FETCH_OBJ);
                                            $result = $statement->fetchAll();
     
                                            if($result) {
                                                foreach($result as $row) {
                                        ?>
                                                <!-- On affiche les résultats BDD dans la table -->
                                                <tr>
                                                    <td><?= $row->id; ?></td>
                                                    <td><?= $row->operateurs_identite; ?></td>
                                                    (...)
                                                    <td><?= $row->charge_hebdo; ?></td>
     
                                                    <td>
                                                        <!-- Bouton de MODIFICATION -->
                                                        <a href="operateur_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                    </td>
                                                    <td>
                                                        <!-- Bouton de SUPPRESSION -->
                                                        <form action="code.php" method="POST">
                                                            <button type="submit" name="delete_operateur" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                        </form>
                                                    </td>
                                                </tr>
                                        <?php
                                                }
                                            }
                                                else {     
                                        ?>
                                                <tr>
                                                    <td colspan="3">Aucune donnée trouvée</td>
                                                </tr>
                                        <?php
                                            }
                                        ?>
                                    </tbody>
                                </table>
                            </div>

    tableau pour la table taches
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <!-- Création de la vue du tableau -->
                            <div class="card-body">
                                <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                    <thead>
                                        <tr>
    <th class="text-center"> ID </th>
    <th class="text-center"> Identité de l'opérateur </th>
    (...)
    <th class="text-center"> Charge hebdomadaire </th>
                                            (...)
                                            <th class="w-50"></th>
                                            <th class="w-50"></th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <!-- Récupération des données à insérer dans le tableau -->
                                        <?php
                                            $query = "SELECT * FROM taches";
                                            $statement = $conn->prepare($query);
                                            $statement->execute();
     
                                            $statement->setFetchMode(PDO::FETCH_OBJ);
                                            $result = $statement->fetchAll();
     
                                            if($result) {
                                                foreach($result as $row) {
                                        ?>
                                                <!-- On affiche les résultats BDD dans la table -->
                                                <tr>
    <td><?= $row->id; ?></td>
                                                    <td><?= $row->identite_employe; ?></td>
    (...)
     
    <td><?= $row->charge_hebdo; ?></td>
     
                                                    <td>
                                                        <!-- Bouton de MODIFICATION -->
                                                        <a href="tache_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                    </td>
                                                    <td>
                                                        <!-- Bouton de SUPPRESSION -->
                                                        <form action="code.php" method="POST">
                                                            <button type="submit" name="delete_tache" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                        </form>
                                                    </td>
                                                </tr>
                                        <?php
                                                }
                                            }
                                                else {     
                                        ?>
                                                <tr>
                                                    <td colspan="3">Aucune donnée trouvée</td>
                                                </tr>
                                        <?php
                                            }
                                        ?>
                                    </tbody>
                                </table>
                            </div>


    Merci d'avance.
    Dernière modification par NoSmoking ; 22/05/2023 à 18h21.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    taches.charge_hebdo est le résultat de l'addition de trois autres colonnes de cette même table : elle est ainsi auto-générée.
    Je n'aime pas particulièrement les colonnes autogénérées, mais soit.

    AInsi operateurs.charge_hebdo doit avoir, de façon automatique, le même résultat que taches.charge_hebdo, pour un même id représentant donc un même opérateur sur les deux tables.
    Seule la charge_hebdo change selon ces différents opérateurs.
    Il ne faut pas dupliquer les données. C'est le meilleur moyen d'avoir des incohérences.

    Si les valeurs sont identiques, et doivent le demeurer, alors 1 seule colonne doit être utilisée.
    Fais une jointure pour récupérer taches.charge_hebdo au besoin.

    comment puis-je procéder, pour recevoir automatiquement le résultat de taches.charge_hebdo dans ma colonne operateurs.charge_hebdo ?
    Donne ton schéma, donne ton SQL actuel, donne le résultat attendu, autrement c'est difficile d'être plus précis.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pour l'heure, ce sont des données horaires fictives, surtout pour la charge_hebdo qui devra être comme suit : taches.charge_hebdo == operateurs.charge_hebdo

    Voici le code de la table taches :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE TABLE `taches` (
      `id` int(4) NOT NULL,
      `identite_employe` varchar(100) NOT NULL,
      `charge_s_fab` time NOT NULL,
      `charge_s_rect` time NOT NULL,
      `charge_s_mep` time NOT NULL,
      `charge_hebdo` time GENERATED ALWAYS AS (`charge_s_fab` + `charge_s_rect` + `charge_s_mep`) VIRTUAL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
     
    --
     
    INSERT INTO `taches` (`id`, `identite_employe`, `charge_s_fab`, `charge_s_rect`, `charge_s_mep`) VALUES
    (1, 'Homer', '11:06:06', '01:18:09', '08:07:08'),
    (2, 'Marge', '08:06:57', '02:18:06', '14:08:26');
     
    --
    ALTER TABLE `taches`
      ADD PRIMARY KEY (`id`);
     
    --
    ALTER TABLE `taches`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;



    Et celui de la table operateurs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE TABLE `operateurs` (
      `id` int(4) NOT NULL,
      `operateurs_identite` varchar(100) NOT NULL,
      `semaine` int(2) NOT NULL,
      `charge_hebdo` time NOT NULL,
      `dispo_hebdo` time NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
     
    --
     
    INSERT INTO `operateurs` (`id`, `operateurs_identite`, `semaine`, `charge_hebdo`, `dispo_hebdo`) VALUES
    (1, 'Homer', 2, '07:07:17', '33:07:10'),
    (2, 'Marge', 1, '05:07:57', '15:17:57');
     
    --
    ALTER TABLE `operateurs`
      ADD PRIMARY KEY (`id`);
     
    --
    ALTER TABLE `operateurs`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    COMMIT;


    D'après toi, est-ce possible, dans mon code PHP - structuré en MVC -, d'inclure une jointure entre ces deux tables, afin de générer automatiquement le résultat de charge_hebdo dans la table operateurs ?
    Dernière modification par NoSmoking ; 22/05/2023 à 18h20.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    1. Tu donnes le DDL et un échantillon, merci

    Quelques commentaires :

    Tu as 2 colonnes TEXT "identite_employe" et "operateurs_identite", c'est contreperformant et sujet à anomalies.
    Il te faut une table de référence employés/utilisateurs et des clefs primaires/étrangères numériques assurant performance et intégrité.

    `semaine` int(2) NOT NULL,
    Si ceci représente un numéro de semaine et que tu comptes la coder sur 2 chiffres alors c'est insuffisant (et l'usage d'une longueur pour un INT, ici le "(2)", est déprécié)
    Pour une semaine il faut YYYYWW, soit 6 chiffres => C'est le format d'un YEARWEEK(...) par exemple
    Autrement tu ne passeras pas 1 année d'activité

    2. Par contre tu ne donnes pas le résultat attendu

    Et cette histoire de charge_hebdo reportée n'est pas claire pour moi.

    Alors oui, bien sûr, tu pourrais lancer des calculs régulièrement, ou dès que ta table des tâches est modifiée, mais ce n'est sûrement pas une bonne solution.

    Tu parles de charge_*hebdo*, mais que se passe-t-il une fois la semaine passée ? Tu repars à zéro ?
    Tu ne gardes que la charge de la semaine courante ? Précédente ? Tu fais une moyenne ?
    Sans exemple de ce que tu souhaites obtenir c'est difficile de te répondre.
    De plus attention de ne pas mélanger les problématiques PHP/MVC et SQL / Modélisation, ça n'a rien à voir !

    Si l'objectif est de distribuer des tâches avec un temps de travail estimé ou réalisé
    et ensuite avoir un rapport par utilisateur de la charge de travail hebdomadaire
    alors ceci suffit :

    user (§id, name)
    task (§id, finished_at DATE, workload TIME, #user_id(user.id))


    task.finished_at est la date à laquelle la tâche est réalisée
    task.workload est le temps de travail de réalisation de la tâche

    Connaître le nombre d'heures par semaine par utilisateur :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ALL u.name, YEARWEEK(t.finished_at, 3) AS period, SUM(t.workload) AS workload_sum
    FROM user AS u
    INNER JOIN task AS t ON u.id = t.user_id
    GROUP BY 1, 2

    Avec des CTE pour illustrer l'exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    WITH
    	user (id, name) AS (
    		VALUES
    			ROW (10, 'Gaëlle'),
    			ROW (20, 'Franck')
    	),
    	task (id, finished_at, workload, user_id) AS (
    		VALUES
    			ROW (1, DATE'2023-05-02', TIME'02:00:00', 20),
    			ROW (2, DATE'2023-04-25', TIME'01:30:00', 20),
    			ROW (3, DATE'2023-04-29', TIME'00:50:00', 10),
    			ROW (4, DATE'2023-04-30', TIME'01:00:00', 20),
    			ROW (5, DATE'2023-04-28', TIME'00:35:00', 10)
    	)
    SELECT ALL
    	u.name, YEARWEEK(t.finished_at, 3) AS period,
    	SEC_TO_TIME(SUM(TIME_TO_SEC(workload))) AS workload_sum
    FROM task AS t
    INNER JOIN user AS u ON t.user_id = u.id
    GROUP BY 1, 2;

    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    name	period	workload_sum
    Gaëlle	202317	01:25:00
    Franck	202318	02:00:00
    Franck	202317	02:30:00
    Voilà, on calcule la charge de travail hebdomadaire à la réalisation à la volée. Libre à toi de placer cette requête dans une vue (CREATE VIEW), tu auras ainsi une ~table dynamique ne nécessitant pas d'entretien et sans risque d'incohérences, qu'il te suffira d'interroger pour sortir des rapports avec PHP.

  5. #5
    Invité
    Invité(e)
    Par défaut
    je trouve cette requête plutôt intéressante dans le cadre de mon projet mais ne comprends pas encore comment je puis l'adapter mon code et où la placer (modèle ?) pour que la charge_hebdo soit, in fine, automatiquement implémentée.
    Dernière modification par NoSmoking ; 04/05/2023 à 10h31. Motif: Inutile de citer un message pour y répondre.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous.

    Je n'ai toujours pas réussi à passer les valeurs de la colonne charge_hebdo (table taches) vers la colonne charge_hebdo (table operateurs) : y'a-t-il quelqu'un qui puisse m'aider à terminer cette quête ?!

    Merci d'avance.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous.

    Je n'ai toujours pas réussi à passer les valeurs de la colonne charge_hebdo (table taches) vers la colonne charge_hebdo (table operateurs) : y'a-t-il quelqu'un qui puisse m'aider à terminer cette quête ?!

    Merci d'avance.

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Il faut donner le DDL des tables (structure), un échantillon de données et le résultat attendu.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, je reprends ce qui était présent au-dessus :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE TABLE `taches` (
      `id` int(4) NOT NULL,
      `identite_employe` varchar(100) NOT NULL,
      `charge_s_fab` time NOT NULL,
      `charge_s_rect` time NOT NULL,
      `charge_s_mep` time NOT NULL,
      `charge_hebdo` time GENERATED ALWAYS AS (`charge_s_fab` + `charge_s_rect` + `charge_s_mep`) VIRTUAL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
     
    --
     
    INSERT INTO `taches` (`id`, `identite_employe`, `charge_s_fab`, `charge_s_rect`, `charge_s_mep`) VALUES
    (1, 'Homer', '11:06:06', '01:18:09', '08:07:08'),
    (2, 'Marge', '08:06:57', '02:18:06', '14:08:26');
     
    --
    ALTER TABLE `taches`
      ADD PRIMARY KEY (`id`);
     
    --
    ALTER TABLE `taches`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TABLE `operateurs` (
      `id` int(4) NOT NULL,
      `operateurs_identite` varchar(100) NOT NULL,
      `semaine` int(2) NOT NULL,
      `charge_hebdo` time NOT NULL,
      `dispo_hebdo` time NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
     
     
     
    INSERT INTO `operateurs` (`id`, `operateurs_identite`, `semaine`, `charge_hebdo`, `dispo_hebdo`) VALUES
    (1, 'Homer', 2, '07:07:17', '33:07:10'),
    (2, 'Marge', 1, '05:07:57', '15:17:57');
     
    ALTER TABLE `operateurs`
      ADD PRIMARY KEY (`id`);
     
     
    ALTER TABLE `operateurs`
      MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    COMMIT;


    LE TABLEAU QUI REPREND LES ÉLÉMENTS DE LA TÂBLE TACHES :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <!-- Création de la vue du tableau -->
                            <div class="card-body">
                                <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                    <thead>
                                        <tr>
    <th class="text-center"> ID </th>
    <th class="text-center"> Identité de l'opérateur </th>
    (...)
    <th class="text-center"> Charge hebdomadaire </th>
                                            (...)
                                            <th class="w-50"></th>
                                            <th class="w-50"></th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <!-- Récupération des données à insérer dans le tableau -->
                                        <?php
                                            $query = "SELECT * FROM taches";
                                            $statement = $conn->prepare($query);
                                            $statement->execute();
     
                                            $statement->setFetchMode(PDO::FETCH_OBJ);
                                            $result = $statement->fetchAll();
     
                                            if($result) {
                                                foreach($result as $row) {
                                        ?>
                                                <!-- On affiche les résultats BDD dans la table -->
                                                <tr>
    <td><?= $row->id; ?></td>
                                                    <td><?= $row->identite_employe; ?></td>
    (...)
     
    <td><?= $row->charge_hebdo; ?></td>
     
                                                    <td>
                                                        <!-- Bouton de MODIFICATION -->
                                                        <a href="tache_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                    </td>
                                                    <td>
                                                        <!-- Bouton de SUPPRESSION -->
                                                        <form action="code.php" method="POST">
                                                            <button type="submit" name="delete_tache" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                        </form>
                                                    </td>
                                                </tr>
                                        <?php
                                                }
                                            }
                                                else {     
                                        ?>
                                                <tr>
                                                    <td colspan="3">Aucune donnée trouvée</td>
                                                </tr>
                                        <?php
                                            }
                                        ?>
                                    </tbody>
                                </table>
                            </div>


    LE TABLEAU QUI REPREND LES ÉLÉMENTS DE LA TABLE OPERATEURS :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
      <!-- Création de la vue du tableau -->
                            <div class="card-body">
                                <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                    <thead>
                                        <tr>
                                            <th class="text-center">ID</th>
                                            <th class="text-center">Identité</th>
                                            (...)
                                            <th class="text-center">Charge hebdomadaire</th>
                                            <th></th>
                                            <th></th>
                                        </tr>
                                    </thead>
     
                                    <tbody>
                                        <?php
                                        // On récupère les données contenues dans la BDD
                                            $query = "SELECT * FROM operateurs ORDER BY id ASC";
                                            $statement = $conn->prepare($query);
                                            $statement->execute();
                                            $statement->setFetchMode(PDO::FETCH_OBJ);
                                            $result = $statement->fetchAll();
     
                                            if($result) {
                                                foreach($result as $row) {
                                        ?>
                                                <!-- On affiche les résultats BDD dans la table -->
                                                <tr>
                                                    <td><?= $row->id; ?></td>
                                                    <td><?= $row->operateurs_identite; ?></td>
                                                    (...)
                                                    <td><?= $row->charge_hebdo; ?></td>
     
                                                    <td>
                                                        <!-- Bouton de MODIFICATION -->
                                                        <a href="operateur_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                    </td>
                                                    <td>
                                                        <!-- Bouton de SUPPRESSION -->
                                                        <form action="code.php" method="POST">
                                                            <button type="submit" name="delete_operateur" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                        </form>
                                                    </td>
                                                </tr>
                                        <?php
                                                }
                                            }
                                                else {     
                                        ?>
                                                <tr>
                                                    <td colspan="3">Aucune donnée trouvée</td>
                                                </tr>
                                        <?php
                                            }
                                        ?>
                                    </tbody>
                                </table>
                            </div>


    RÉSULTAT ATTENDU :
    Je souhaite qu'à la modification de la charge_hebdo dans la colonne taches (elle-même auto-générée), la colonne charge_hebdo de la table opérateurs soit automatiquement modifiée, pour une même personne : dans l'exemple, Homer figure ici dans les 2 colonnes, sa valeur devrait automatiquement modifiée.
    Dernière modification par NoSmoking ; 22/05/2023 à 18h19. Motif: Merci d'indiquer le langage utilisé, [CODE=xxxx], pour activer la coloration syntaxique

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Je crois que le problème vient surtout d'une modélisation de la base de données plus que douteuse et d'un SNR trop bas.

    Tu veux reporter taches.charge_hebdo dans operateurs.charge_hebdo, après chaque modif de ta table taches, et à supposer que taches.id est l'ID de l'opérateur (!?), fais :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE operateurs AS o
    INNER JOIN taches AS t ON o.id = t.id AND <Critère temporel à ajouter, car j'imagine qu'un operateurs.id donné pourra avoir différentes semaines>
    SET o.charge_hebdo = t.charge_hebdo

    Vu que l'échantillon d'origine se limite à 2 lignes et celui d'arrivée à 0 ligne, je ne pourrai pas faire mieux.

    Pour le côté "automatique", il faudra faire une vue. C'est d'ailleurs la bonne manière de faire. Reporter des valeurs de la sorte est une aberration.

    La priorité reste la modélisation de la base à revoir, à mon sens.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci pour ton aide.

    Qu'est-ce-que tu veux dire par "plus que douteuse" ? Que signifie SNR ?
    D'après toi, comment puis-je améliorer ma BDD ?

    Oui, merci, ça faisait longtemps que je n'avais pas vu les jointures. Je teste ça dans mon interface PHPMyAdmi, mais comment puis-je inclure cette requête dans le code de ma vue, afin que le passage des valeurs de taches.charge_hebdo vers operateurs.charge_hebdo se fasse automatiquement ?

    Voici le code de ma vue pour les operateurs :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <!-- Création de la vue du tableau -->
                                <div class="card-body">
                                    <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                        <thead>
                                            <tr>
                                                <th class="text-center">ID</th>
                                                <th class="text-center">Identité</th>
                                                <th class="text-center">Semaine</th>
                                                <th class="text-center">Charge hebdomadaire</th>
                                                <th class="text-center">Disponibilité hebdomadaire</th>
                                                <th></th>
                                                <th></th>
                                            </tr>
                                        </thead>
     
                                        <tbody>
                                            <?php 
                                            // On récupère les données contenues dans la BDD
                                                $query = "SELECT * FROM operateurs ORDER BY id ASC";
                                                $statement = $conn->prepare($query);
                                                $statement->execute();
                                                $statement->setFetchMode(PDO::FETCH_OBJ);
                                                $result = $statement->fetchAll();
     
                                                if($result) {
                                                    foreach($result as $row) {
                                            ?>
                                                    <!-- On affiche les résultats BDD dans la table -->
                                                    <tr>
                                                        <td><?= $row->id; ?></td>
                                                        <td><?= $row->operateurs_identite; ?></td>
                                                        <td><?= $row->semaine; ?></td>
                                                        <td><?= $row->charge_hebdo; ?></td>
                                                        <td><?= $row->dispo_hebdo; ?></td>
                                                        <td>
                                                            <!-- Bouton de MODIFICATION -->
                                                            <a href="operateur_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                        </td>
                                                        <td>
                                                            <!-- Bouton de SUPPRESSION -->
                                                            <form action="code.php" method="POST">
                                                                <button type="submit" name="delete_operateur" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                            </form>
                                                        </td>
                                                    </tr>
                                            <?php
                                                    }
                                                }
                                                    else {       
                                            ?>
                                                    <tr>
                                                        <td colspan="3">Aucune donnée trouvée</td>
                                                    </tr>
                                            <?php
                                                }
                                            ?>
                                        </tbody>
                                    </table>
                                </div>


    Et celui de ma vue pour les tâches :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <!-- Création de la vue du tableau -->
                                <div class="card-body">
                                    <table id="table1" class="table table-bordered table-striped mx-auto text-center">
                                        <thead>
                                            <tr>
                                                <th class="text-center"> ID </th>
                                                <th class="text-center"> Identité de l'opérateur </th>
                                                <th class="text-center"> ChargeFAB </th>
                                                <th class="text-center"> ChargeRE7 </th>
                                                <th class="text-center"> ChargeMEP </th>
                                                <th class="text-center"> Charge hebdomadaire </th> 
                                                <th class="w-50"></th>
                                                <th class="w-50"></th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                            <!-- Récupération des données à insérer dans le tableau -->
                                            <?php
                                                $query = "SELECT * FROM taches";
                                                $statement = $conn->prepare($query);
                                                $statement->execute();
     
                                                $statement->setFetchMode(PDO::FETCH_OBJ);
                                                $result = $statement->fetchAll();
     
                                                if($result) {
                                                    foreach($result as $row) {
                                            ?> 
                                                    <!-- On affiche les résultats BDD dans la table -->
                                                    <tr>
                                                        <td><?= $row->id; ?></td>
                                                        <td><?= $row->operateurs_identite; ?></td>
                                                        <td><?= $row->charge_s_fab; ?></td>
                                                        <td><?= $row->charge_s_rect; ?></td>
                                                        <td><?= $row->charge_s_mep; ?></td>
                                                        <td><?= $row->charge_hebdo; ?></td>
                                                        <td>
                                                            <!-- Bouton de MODIFICATION -->
                                                            <a href="tache_edit.php?id=<?= $row->id; ?>" class="btn btn-warning rounded-pill"><i class="fa fa-edit"></i>Modifier</a>
                                                        </td>
                                                        <td>
                                                            <!-- Bouton de SUPPRESSION -->
                                                            <form action="code.php" method="POST">
                                                                <button type="submit" name="delete_tache" value="<?=$row->id;?>" class="btn btn-danger rounded-pill"><i class="fa fa-trash"></i>Supprimer</button>
                                                            </form>
                                                        </td>
                                                    </tr>
     
                                            <?php
                                                    }
                                                }
                                                    else {       
                                            ?>
                                                    <tr>
                                                        <td colspan="3">Aucune donnée trouvée</td>
                                                    </tr>
                                            <?php
                                                }
                                            ?>
                                        </tbody>
                                    </table>
                                </div>

    À première vue, je pensais au trigger mais je ne sais pas si c'est pertinent dans ce cas-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER taches_charge_hebdo_update AFTER UPDATE ON taches FOR EACH ROW
    BEGIN
    IF NEW.charge_hebdo IS DISTINCT FROM OLD.charge_hebdo THEN
    UPDATE operateurs SET charge_hebdo = NEW.charge_hebdo
    WHERE operateurs_identite = NEW.operateurs_identite;
    END IF;
    END
    Mais ça ne passe visiblement pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1303 - Can't create a TRIGGER from within another stored routine
    À ce propos, je me pose cette question : est-il possible de créer un trigger qui agit sur la valeur d'une colonne auto-générée, comme c'est le cas avec charge_hebdo ?

    Dans mon fichier code.php, où je place les différentes requêtes qui agissent au clic d'un des boutons du tableau, j'ai rajouté la requête de jointure pour permettre la copie des données de la colonne taches.charge_hebdo vers la colonne operateurs.charge_hebdo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    //  MODIFICATION
     
       if(isset($_POST['update_tache_btn'])) {
           $id = $_POST['id'];
           $operateurs_identite = $_POST['operateurs_identite'];
           $charge_s_fab = $_POST['charge_s_fab'];
           $charge_s_rect = $_POST['charge_s_rect'];
           $charge_s_mep = $_POST['charge_s_mep'];
           $charge_hebdo = $_POST['charge_hebdo'];
     
           try {
     
               $query = "UPDATE taches
               SET operateurs_identite=:operateurs_identite,
               charge_s_fab=:charge_s_fab,
               charge_s_rect=:charge_s_rect,
               charge_s_mep=:charge_s_mep,
               charge_hebdo=:charge_hebdo,
               WHERE id=:tache_id LIMIT 1";
               $statement = $conn->prepare($query);
     
               $data = [
                   ':operateurs_identite' => $operateurs_identite,
                   ':charge_s_fab'=> $charge_s_fab,
                   ':charge_s_rect'=> $charge_s_rect,
                   ':charge_s_mep'=> $charge_s_mep,
                   ':charge_hebdo'=> $charge_hebdo,
                   ':tache_id'=> $id,
               ];
     
               $query_execute = $statement->execute($data);
     
               if($query_execute)
               {
                   $_SESSION['message'] = "La modification est effectuée.";
                   header('Location: index.php?page=2');
                   exit(0);
               }
               else
               {
                   $_SESSION['message'] = "La modification n'a pas pu aboutir.";
                   header('Location: tache_edit.php');
                   exit(0);
               }
     
               $query2 = "UPDATE operateurs AS o
                   INNER JOIN taches AS t
                   ON o.operateurs_identite = t.operateurs_identite
                   SET o.charge_hebdo = t.charge_hebdo";
               $statement2 = $conn->prepare($query2);
               $query_execute2 = $statement2->execute($data);
     
           }
           catch (PDOException $e) {
               echo $e->getMessage();
           }
       }
    Mais la query2 que je viens d'ajouter n'est pas fonctionnelle et cela me semble ajouter de la complexité à la compréhension du code : qu'en penses-tu ?
    Dernière modification par Invité ; 25/05/2023 à 16h21.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Re !

    Je reviens par ici pour savoir si quelqu'un a pu trouver la solution à cette copie de données entre tables : de mon côté, chou blanc ! Pour le moment ...

    Merci.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 589
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Recopier la valeur d'une colonne de la table des tâches dans une autre colonne de la tables des opérateurs n'est pas une bonne chose, c'est même une hérésie d'un point de vue conceptuel.
    Soit cette valeur dépend fonctionnellement de la tâche, auquel cas elle doit être présente uniquement dans la table des tâches.
    Soit cette valeur dépend fonctionnellement de l'opérateur, alors elle doit être présente uniquement dans la table des opérateurs.
    Soit elle dépend de l'un et de l'autre, alors elle doit être dans une table associative (issue d'une relation n-n) entre tâches et opérateurs.
    Dans une base de données relationnelle, les seules redondances acceptables sont les clefs étrangères.

    Par ailleurs, dans la table des opérateurs, on trouve une colonne "identite_employe" de type varchar(100) et une colonne "semaine" de type integer.
    Si identite_employe contient le nom de l'opérateur, il manque une colonne prenom et sans doute d'autres attributs en fonction du besoin (date de naissance, matricule employé, date d'embauche...)
    Si identite_employe contient nom et prénom ou tout autre combinaison de valeurs, alors c'est une erreur grave de modélisation.
    Et la colonne "semaine" est suspecte, comment la semaine peut elle dépendre fonctionnellement de l'identifiant de l'opérateur, que représente cet attribut ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci pour cette réponse détaillée qui me permet d'y voir un peu plus clair.

    Oui, cette valeur dépend de la table taches puisque elle DOIT être le résultat de l'addition de trois autres colonnes prévues dans cette tables, d'où le fait qu'elle soit auto-générée (charge_s_fab + charge_s_rect + charge_s_mep = charge_hebdo).
    Le renseignement de ces valeurs se fait via un formulaire et lors de la validation, cela envoie les données vers la BDD MySQL et les affiche aussi sur mon outil en PHP.

    Cependant, le résultat de charge_hebdo DOIT aussi apparaître et de façon automatique dès modification de celle-ci dans la table operateurs.
    De même, la colonne dispo_hebdo dépend de la valeur de charge_hebdo car une valeur égale à 35 heures (par exemple) - charge_hebdo = dispo_hebdo.

    Dans ce cas, quelle est la solution la plus adaptée, selon vous ?

    Pour le champ concernant l'identité de l'employé, il m'a paru plus simple et rapide de créer une seule colonne avec nom et prénom. Pour les autres données citées, elles ne sont pas nécessaires dans ce projet, mais je vous en remercie.

    Enfin, concernant la semaine, elle ne dépend pas de l'identifiant, ou alors j'ai peut-être commis une erreur dans mon code : pourriez-vous me préciser ce qui cloche selon vous ?

    Merci d'avance pour toutes vos explications.

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 589
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par (.....) Voir le message
    Cependant, le résultat de charge_hebdo DOIT aussi apparaître et de façon automatique dès modification de celle-ci dans la table operateurs.
    Pourquoi ? Quel est le besoin fonctionnel ? Qu'elle que soit la raison, la redondance est presque toujours une erreur (sauf cas très particuliers de dénormalisation, à n'envisager qu'après avoir évacué les autres solutions)



    Citation Envoyé par (.....) Voir le message
    Pour le champ concernant l'identité de l'employé, il m'a paru plus simple et rapide de créer une seule colonne avec nom et prénom. Pour les autres données citées, elles ne sont pas nécessaires dans ce projet, mais je vous en remercie.
    Il ne faut jamais stocker plusieurs informations dans une même intersection ligne/colonne, c'est d'ailleurs la première règle incontournable de la modélisation d'une base de données relationnelles (dite règle de "1re forme normale")
    Déroger à cette règle est la source de tous les maux : données non fiables, requêtes complexes, performances désastreuses, etc.

    Citation Envoyé par (.....) Voir le message
    Enfin, concernant la semaine, elle ne dépend pas de l'identifiant, ou alors j'ai peut-être commis une erreur dans mon code : pourriez-vous me préciser ce qui cloche selon vous ?
    Alors ça confirme qu'il faut supprimer cette colonne de la table des opérateurs, la aussi, c'est une règle incontournable de la modélisation de toute base de données relationnelle. Il s'agit cette fois d'un viol de la 2e forme normale, qui stipule que tout attribut non identifiant doit dépendre de l'identifiant.

    Vous trouverez une description simplifiée des formes normales dans Wikipédia ICI

    Et une description détaillée et surtout bien plus rigoureuse, dans un article de Fsmrel

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pour la première, c'est parce qu'à partir de la charge_hebdo (entre autres données), je dois afficher un graphique.
    Voilà la raison de la nécessité de cette colonne.

    Pour la deuxième, si j'affiche un nom et un prénom dans la même colonne et que ça n'est apparemment pas recommandé, dois-je donc, désormais, dans ma base de données, mes formulaires, enfin tout mon code ... séparer en une colonne NOM et une autre PRÉNOM ? Est-ce bien le cas ?

  17. #17
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 589
    Billets dans le blog
    10
    Par défaut
    On peut très bien afficher un graphique en récupérant la valeur dans la table des tâches plutôt que dans celle des opérateurs.
    Les considérations relatives aux traitements ne doivent en rien impacter la modélisation des données.

    Pour le deuxième point, oui, il faut impérativement stocker chaque attribut dans une colonne spécifique.

    Il est très important de consacrer du temps à la bonne modélisation de la base de données, car ensuite, s'il y a des modifications de structure à apporter, ça impacte non seulement la base de données, mais aussi les traitements. C'est donc un coût considérable.

    Pour bien modéliser une base de données, il y a i, forum consacré dans lequel vous pourrez poser toutes les questions, il se trouve ICI.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Dans ce cas, vu que j'ai déjà modifié ma table taches en supprimant la colonne charge_hebdo et divisé la colonne operateurs_identite de la table operateurs - comme tu me l'avais recommandé - , comment puis-je faire en sorte que je récupère les valeurs de l'addition des trois colonnes de cette même table (charge_s_fab / charge_s_rect / charge_s_mep) puis affiche le tout dans mon graphique ?

    Merci.

  19. #19
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 589
    Billets dans le blog
    10
    Par défaut
    Tout simplement en effectuant une jointure (JOIN) entre la table des opérateurs et celle des tâches

    J'en profite pour rappeler qu'il ne faut jamais utiliser SELECT * dans un livrable, contrairement à ce que vous avez mis dans vos requêtes.
    Voir pourquoi dans mon blog ICI

  20. #20
    Invité
    Invité(e)
    Par défaut
    Re !

    Avez-vous des idées pour mieux comprendre pourquoi le passage des données entre les tables ne fonctionne pas ? Et comment faire en sorte que cela marche ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/11/2008, 20h26
  2. [MySQL] Lier deux tables php mysql
    Par a.brioit dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/09/2008, 13h32
  3. [MySQL] Relier différentes tables en Mysql
    Par finalfx dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/06/2007, 08h25
  4. [Drupal] Passage de données entre applications sur différents serveurs
    Par navis84 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 26/07/2006, 11h36
  5. [ADO.Net][VB.NET] Comment copier des données entre deux BDD différentes ?
    Par maddog2032 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/06/2005, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo