Selectievakjes vertegenwoordigen een lijst met waarden. Een gebruiker kan meerdere selectievakjes selecteren, wat betekent dat u voor elk gebruikersrecord een lijst met waarden kunt hebben. Om deze reden heeft u een andere tabel in uw database nodig om deze opties op te slaan. In feite heb je in totaal drie tabellen nodig:bloeddonor, activiteiten, activiteiten_per_donor. Zie voor meer informatie Wat is de beste manier om Checkbox-waarden op te slaan in MySQL Database?
Het is aan jou hoe je de tabellen ontwerpt, maar je activity_per_donor moet minstens twee kolommen hebben:user_id en activity. U moet ook een samengestelde primaire sleutel voor beide kolommen maken om dubbele waarden te voorkomen. De activiteitskolom moet verwijzen naar uw vooraf gedefinieerde lijst met activiteiten uit de derde tabel, zodat een gebruiker geen ongeldige activiteit kan invoegen.
Wanneer uw formulier correct is gemaakt en uw selectievakjes worden genoemd als een array (d.w.z. name="act[]"
) dan ontvangt u een reeks van geselecteerde waarden in PHP in $_POST['act']
variabel. Als er geen waarden zijn geselecteerd, wordt deze variabele niet ingesteld, dus u moet dat ook controleren. U moet deze array verwerken en elk element als een nieuwe rij invoegen in de tabel activity_per_donor
Meerdere selectievakjes opslaan met PDO
Meestal zou u PDO gebruiken om met de database te communiceren. Om de waarden in te voegen, moet u een voorbereide instructie uitvoeren. U moet de donorgegevens in de ene tabel invoegen en hun activiteiten in een andere, wat vereist dat u beide bijlagen in een transactie verpakt.
$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();
}
Meerdere selectievakjes opslaan met mysqli
Als je mysqli moet gebruiken, kun je nog steeds hetzelfde bereiken met een zeer vergelijkbare code. We starten opnieuw een transactie en voeren 2 voorbereide instructies uit en leggen deze vervolgens vast in de database.
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();
}