2 pièce(s) jointe(s)
Multiple Checkbox vers MySQL
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:
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
Code:
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 !');
}
}
?> |
fichier groupes.php :
Code:
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:
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:
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 :
Pièce jointe 603447
Pièce jointe 603448
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.