Bonjour,
J'ai une table 'devices' avec un id et un nom pour chaque device, et une seconde table 'groupes' avec un id et un nom pour chaque groupe.
Exemple de table 'device' :
dev_id dev_name 1 Compteur 01 2 Compteur 02 3 Compteur 03 4 Compteur 04 5 Compteur 05 6 Compteur 06
Exemple de table 'groupe' :
grp_id grp_name 1 Groupe 01 2 Groupe 02
Comment affecter les devices aux groupes (ou inversement) ? par exemple si j'ai ces 6 devices et 2 groupes à répartir par exemple comme ceci : dev_id 1, 2 et 3 au groupe 1 et les dev_id 3, 4, 5, 6 au groupe 2 ?
Est-ce qu'il faut créer une table supplémentaire 'groupesdev' qui contiendrait les colonnes grp_id et dev_id pour faire les liens ? Donc dans l'exemple suivant donnerai ceci :
grpsdevs_grp_id grpsdevs_dev_id 1 1 1 2 1 3 2 3 2 4 2 5 2 6
Ou plutôt ajouter une colonne à la table devices, dev_grp_id afin qu'elle deviennent ainsi :
dev_id dev_name dev_grp_id 1 Compteur 01 1 2 Compteur 02 1 3 Compteur 03 1, 2 4 Compteur 04 2 5 Compteur 05 2 6 Compteur 06 2
Et sur la partie html / php, comment faire pour lors de la Lecture, Création, l'Edition, Suppression (CRUD) ces valeurs soient correctement mise à jour.
La solution avec table dédiée est peut être plus compliqué à gérer car plusieurs lignes, lors d'une modification il est donc possible d'avoir à faire un UPDATE, un INSERT, un DELETE lors du submit du formulaire si je ne me trompe ?
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
23
24
25
26
27
28
29
30 -- Structure de la table `devices` CREATE TABLE `devices` ( `dev_id` int(11) NOT NULL, `dev_name` varchar(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Déchargement des données de la table `devices` INSERT INTO `devices` (`dev_id`, `dev_name`) VALUES (1, 'Compteur 01'), (2, 'Compteur 02'), (3, 'Compteur 03'), (4, 'Compteur 04'), (5, 'Compteur 05'), (6, 'Compteur 06'); -- -------------------------------------------------------- -- Structure de la table `groupes` CREATE TABLE `groupes` ( `grp_id` int(11) NOT NULL, `grp_name` varchar(25) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- Déchargement des données de la table `groupes` INSERT INTO `groupes` (`grp_id`, `grp_name`) VALUES (1, 'Groupe 01'), (2, 'Groupe 02');
Et auriez vous des exemples de CRUD de ce genre ?
J'ai tenté un début avec la solution à 3 tables, sans succès. Je suis totalement novice.
Merci de votre aide.
fichier database.php
fichier groupes.php :
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 <?php function pdo_connect_mysql() { $database_server = '127.0.0.1'; $database_user = 'root'; $database_password = ''; $database_name = 'database'; $options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::MYSQL_ATTR_INIT_COMMAND => "SET lc_time_names = 'fr_FR'", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { return new PDO('mysql:host=' . $database_server . ';dbname=' . $database_name . ';charset=utf8', $database_user, $database_password, $options); } catch (PDOException $exception) { // If there is an error with the connection, stop the script and display the error. exit('La connexion à la base de données a échouée !'); } } ?>
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
63
64
65
66
67
68
69
70
71
72
73 <!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <?php // Inclure la connexion à la base include_once 'database.php'; // Se connecter $pdo = pdo_connect_mysql(); // Récupérer la liste des groupes $request_groupes = $pdo->prepare("SELECT * FROM `groupes` ORDER BY grp_id"); $request_groupes->execute(); $groupes = $request_groupes->fetchAll(PDO::FETCH_ASSOC); ?> <div class="content-body"> <!-- row --> <div class="container-fluid"> <div class="row pt-3"> <div class="col-6"> <div class="card"> <div class="card-header"> <h5 class="card-title">Groupes</h5> <a href="groupe-add.php" class="btn btn-rounded btn-outline-success btn-sm" style="float: right;">Ajouter</a> </div> <div class="card-body"> <table class="table table-bordered table-hover table-responsive-sm"> <thead> <tr> <th>#</th> <th>Nom</th> <th>Devices du groupe</th> <th align="center"></th> <th align="center"></th> </tr> </thead> <tbody> <?php foreach ($groupes as $groupe): ?> <tr> <td><?=$groupe['grp_id']?></td> <td><?=$groupe['grp_name']?></td> <td> <!-- comment faire --> </td> <td align="center" class="actions"> <a href="groupe-edit.php?grp_id=<?=$groupe['grp_id']?>" class="btn btn-rounded btn-primary">Editer</a> </td> <td align="center" class="actions"> <?php if($groupe['grp_id'] != 1) { ?> <a href="groupe-delete.php?grp_id=<?=$groupe['grp_id']?>" class="btn btn-rounded btn-danger">Supprimer</a> <?php }; ?> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> </div> </div> </div> </body> </html>
fichier groupe-add.php
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 <!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <?php // Inclure la connexion à la base include_once 'database.php';?> <?php // Se connecter $pdo = pdo_connect_mysql(); // Récupérer la liste des devices $request_devices = $pdo->prepare("SELECT * FROM `devices` ORDER BY dev_name"); $request_devices->execute(); $devices = $request_devices->fetchAll(PDO::FETCH_ASSOC); ?> <?php $msg = ''; // Check if POST data is not empty if (!empty($_POST)) { $grp_id = isset($_POST['grp_id']) && !empty($_POST['grp_id']) && $_POST['grp_id'] != 'auto' ? $_POST['grp_id'] : NULL; $grp_name = isset($_POST['grp_name']) ? $_POST['grp_name'] : ''; $grpsdevs_dev_id = isset($_POST['grpsdevs_dev_id']) ? $_POST['grpsdevs_dev_id'] : NULL; // Ajouter le nouveau groupe (ID et Nom) dans la table groupes $stmt = $pdo->prepare('INSERT INTO `groupes` (grp_id, grp_name) VALUES (?, ?)'); $stmt->execute([$grp_id, $grp_name]); // Insérer les devices sélectionner pour le groupe dans la table des devices par groupe : groupesdevs if ($grpsdevs_dev_id <> '') { foreach ($grpsdevs_dev_id as $grpdev_dev_id): echo $grp_id . ' ' . $grpdev_dev_id . '<br>'; $stmt2 = $pdo->prepare('INSERT INTO `groupesdevs` (grpsdevs_grp_id, grpsdevs_dev_id) VALUES (?, ?)'); $stmt2->execute([$grp_id, $grpdev_dev_id]); endforeach; } else { echo "Erreur, sélectionner au moins un device !"; } // Output message $msg = 'Created Successfully!'; } ?> <div class="row pt-3"> <div class="col-6"> <div class="card"> <!-- .Card-header --> <div class="card-header"> <h4 class="card-title"> Ajouter un groupe</h4> </div> <div class="card-body"> <div class="basic-form"> <form action="groupe-add.php" method="post"> <div class="form-group row"> <input type="hidden" class="form-control" name="grp_id" placeholder="ID" value="auto" id="grp_id"> </div> <div class="form-group row"> <label class="col-sm-4 col-form-label">Nom du groupe</label> <div class="col-sm-8"> <input type="text" class="form-control" name="grp_name" placeholder="" id="grp_name"> </div> </div> <div class="form-group row"> <label class="col-sm-4 col-form-label">Dispositifs associés</label> <div class="col-sm-8"> <!-- Proposer la liste des devices --> <?php $grpDevs_array = []; foreach ($devices as $device) : $grpDevs_array[] = $device['dev_id']; endforeach; ?> <!-- Proposer une liste des devices avec une checkbox --> <?php foreach ($devices as $device) : ?> <div class="form-check"> <input class="form-check-input" type="checkbox" name="grpsdevs_dev_id[]" <?php echo in_array($device['dev_id'], $grpDevs_array) ?'checked':'';?> id="grpsdevs_dev_id" value="<?=$device['dev_id']?>"> <label class="form-check-label" for="grpsdevs_dev_id"><?=$device['dev_name'];?></label> </div> <?php endforeach; ?> </div> </div> <div class="form-group row"> <div class="col-sm-12"> <button type="submit" class="btn btn-success">Ajouter</button> <a href="groupes.php" type="button" class="btn btn-danger">Retour</a> </div> </div> </form> <?php if ($msg): ?> <p><?=$msg?></p> <?php endif; ?> </div> </div> </div> </div> </div> </body> </html>
fichier groupe-edit.php
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141 <!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <?php // Inclure la connexion à la base include_once 'database.php';?> <?php // Se connecter $pdo = pdo_connect_mysql(); // Récupérer la liste des devices $request_devices = $pdo->prepare("SELECT * FROM `devices` ORDER BY dev_name"); $request_devices->execute(); $devices = $request_devices->fetchAll(PDO::FETCH_ASSOC); ?> <?php $grp_id = isset($_GET['grp_id']) ? $_GET['grp_id'] : NULL; $msg = ''; if (isset($_GET['grp_id'])) { if (!empty($_POST)) { $grp_group_name = isset($_POST['grp_name']) ? $_POST['grp_name'] : ''; $grpsdevs_dev_id = isset($_POST['grpsdevs_dev_id']) ? $_POST['grpsdevs_dev_id'] : ''; print_r($grpsdevs_dev_id); // Update the record $stmt = $pdo->prepare('UPDATE groupes SET grp_name = ? WHERE grp_id = ?'); $stmt->execute([$grp_group_name, $_GET['grp_id']]); //foreach ($grpsdevs_dev_id AS $grpdev_dev_id) : // print_r($grpsdevs_dev_id); echo '<br>'; //$stmt2 = $pdo->prepare("UPDATE grpsdevs SET grpsdevs_dev_id = ? WHERE grpsdevs_grp_id = ? AND grpsdevs_dev_id = '{$grpdev_dev_id}'"); //$stmt2->execute([$grpdev_dev_id, $_GET['grp_id']]); //endforeach; $msg = 'Created Successfully!'; } // Get the devices from the devices table $stmt = $pdo->prepare('SELECT * FROM `groupes` WHERE grp_id = ?'); $stmt->execute([$_GET['grp_id']]); $groupes = $stmt->fetch(PDO::FETCH_ASSOC); if (!$groupes) { exit('Contact doesn\'t exist with that ID!'); } } else { exit('No ID specified!'); } ?> <div class="row pt-3"> <div class="col-6"> <div class="card"> <!-- .Card-header --> <div class="card-header"> <h3 class="card-title">Modifier le groupe "<?=$groupes['grp_name']?>" ?</h3> </div> <div class="card-body"> <div class="basic-form"> <form action="groupe-edit.php?grp_id=<?=$groupes['grp_id']?>" method="post"> <div class="form-group row"> <label class="col-sm-4 col-form-label">Nom :</label> <div class="col-sm-8"> <input type="text" class="form-control" name="grp_group_name" placeholder="Nom de l'appareil" value="<?=$groupes['grp_name']?>" id="grp_name"> </div> </div> <div class="form-group row"> <label class="col-sm-4 col-form-label">Dispositifs associés</label> <div class="col-sm-8"> <!-- Récuperer les devices qui font actuellement partie de ce groupe --> <?php $reqGrpDevs = $pdo->query(" SELECT groupesdevs.grpsdevs_grp_id AS grp_id, G0.grp_name AS grp_name, groupesdevs.grpsdevs_dev_id AS dev_id, D0.dev_name AS dev_name FROM groupesdevs LEFT JOIN `groupes` G0 ON G0.grp_id = groupesdevs.grpsdevs_grp_id LEFT JOIN `devices` D0 ON D0.dev_id = groupesdevs.grpsdevs_dev_id WHERE groupesdevs.grpsdevs_grp_id = '{$grp_id}' "); $grpDevs_array = []; foreach ($reqGrpDevs as $rowGrpDevs) : $grpDevs_array[] = $rowGrpDevs['dev_id']; endforeach; ?> <!-- Proposer une liste des devices avec une checkbox --> <?php foreach ($devices as $device) : ?> <div class="form-check"> <input class="form-check-input" type="checkbox" name="grpsdevs_dev_id[]" <?php echo in_array($device['dev_id'], $grpDevs_array) ?'checked':'';?> id="grpsdevs_dev_id" value="<?=$device['dev_id']?>"> <label class="form-check-label" for="grpsdevs_dev_id"><?=$device['dev_name'];?></label> </div> <?php endforeach; ?> </div> </div> <div class="form-group row"> <div class="col-sm-12"> <button type="submit" class="btn btn-success">Appliquer</button> <a href="groupes.php" type="button" class="btn btn-danger">Retour</a> </div> </div> </form> <?php if ($msg): ?> <p><?=$msg?></p> <?php endif; ?> </div> </div> </div> </div> </div> </body> </html>
Ce qui donne :
Pour la création d'un groupe, cela ne fonctionne pas car il manque l'ID du groupe puisque c'est un auto Increment à cette étape, le groupe n'existant pas encore... Peut être ne pas utiliser auto increment, mais plutôt un incrément manuel par une recherche de l'ID max et faire +1 pour le nouveau, ainsi il sera connu.
Partager