Les cases à cocher représentent une liste de valeurs. Un utilisateur peut sélectionner plusieurs cases à cocher, ce qui signifie que pour chaque enregistrement d'utilisateur, vous pouvez avoir une liste de valeurs. Pour cette raison, vous avez besoin d'une autre table dans votre base de données pour stocker ces options. En fait, vous aurez peut-être besoin de trois tables au total :donneur de sang, activités, activités_par_donneur. Pour plus d'informations, voir Quelle est la meilleure façon de stocker les valeurs des cases à cocher dans la base de données MySQL ?
C'est à vous de décider comment vous concevez les tables, mais votre activities_per_donor doit avoir au moins deux colonnes :user_id et activity. Vous devez également créer une clé primaire composite sur les deux colonnes pour éviter les valeurs en double. La colonne d'activité doit faire référence à votre liste prédéfinie d'activités du troisième tableau afin qu'un utilisateur ne puisse pas insérer une activité non valide.
Lorsque votre formulaire est correctement créé et que vos cases à cocher sont nommées sous forme de tableau (c'est-à-dire name="act[]"
) alors vous recevrez un tableau de selected valeurs en PHP dans $_POST['act']
variable. Si aucune valeur n'est sélectionnée, cette variable ne sera pas définie, vous devez donc également vérifier cela. Vous devez traiter ce tableau et insérer chaque élément en tant que nouvelle ligne dans la table activities_per_donor
Comment stocker plusieurs cases à cocher à l'aide de PDO
La plupart du temps, vous utiliserez PDO pour interagir avec la base de données. Pour insérer les valeurs, vous devez effectuer une instruction préparée. Vous devez insérer les données des donateurs dans une table et leurs activités dans une autre, ce qui nécessite que vous enveloppiez les deux insertions dans une transaction.
$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_EMULATE_PREPARES => false
]);
if (isset($_POST["name"], $_POST["gender"], $_POST["dob"], $_POST["weight"], $_POST["contact"], $_POST["bloodtype"], $_POST["adress"])) {
$pdo->beginTransaction();
// Insert blood donor
$stmt = $pdo->prepare('INSERT INTO blooddonor(name,gender,dob,weight,contact,bloodtype,adress) VALUES (?,?,?,?,?,?,?)');
$stmt->execute([
$_POST["name"],
$_POST["gender"],
$_POST["dob"],
$_POST["weight"],
$_POST["contact"],
$_POST["bloodtype"],
$_POST["adress"],
]);
$donor_id = $pdo->lastInsertId();
// Insert donor's acitvities
if(isset($_POST['act'])) {
$stmt = $pdo->prepare('INSERT INTO activities_per_donor(donor_id, activity) VALUES (?,?)');
$stmt->bindValue(1, $donor_id);
$stmt->bindParam(2, $activity);
foreach ($_POST['act'] as $activity) {
$stmt->execute();
}
}
$pdo->commit();
}
Comment stocker plusieurs cases à cocher à l'aide de mysqli
Si vous devez utiliser mysqli, vous pouvez toujours obtenir la même chose avec un code très similaire. Une fois de plus, nous démarrons une transaction et effectuons 2 déclarations préparées, puis nous la validons dans la base de données.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'password', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
if (isset($_POST["name"], $_POST["gender"], $_POST["dob"], $_POST["weight"], $_POST["contact"], $_POST["bloodtype"], $_POST["adress"])) {
$mysqli->begin_transaction();
// Insert blood donor
$stmt = $mysqli->prepare('INSERT INTO blooddonor(name,gender,dob,weight,contact,bloodtype,adress) VALUES (?,?,?,?,?,?,?)');
$stmt->bind_param('sssssss', $_POST["name"], $_POST["gender"], $_POST["dob"], $_POST["weight"], $_POST["contact"], $_POST["bloodtype"], $_POST["adress"]);
$stmt->execute();
$donor_id = $mysqli->insert_id;
// Insert donor's acitvities
if(isset($_POST['act'])) {
$stmt = $mysqli->prepare('INSERT INTO activities_per_donor(donor_id, activity) VALUES (?,?)');
$stmt->bind_param('ss', $donor_id, $activity);
foreach ($_POST['act'] as $activity) {
$stmt->execute();
}
}
$mysqli->commit();
}