Zaškrtávací políčka představují seznam hodnot. Uživatel může vybrat více zaškrtávacích políček, což znamená, že pro každý uživatelský záznam můžete mít seznam hodnot. Z tohoto důvodu potřebujete další tabulku ve vaší databázi pro uložení těchto voleb. Ve skutečnosti můžete potřebovat celkem tři tabulky:dárce krve, aktivity, aktivity_na_dárce. Další informace viz Jaký je nejlepší způsob uložení hodnot Checkbox v databázi MySQL?
Je na vás, jak si tabulky navrhnete, ale vaše activities_per_donor musí mít alespoň dva sloupce:user_id a activity. Měli byste také vytvořit složený primární klíč v obou sloupcích, abyste se vyhnuli duplicitním hodnotám. Sloupec aktivity by měl odkazovat na váš předdefinovaný seznam aktivit ze třetí tabulky, aby uživatel nemohl vložit neplatnou aktivitu.
Když je formulář správně vytvořen a vaše zaškrtávací políčka jsou pojmenována jako pole (tj. name="act[]"
), pak obdržíte pole vybraných hodnoty v PHP v $_POST['act']
proměnná. Pokud nejsou vybrány žádné hodnoty, tato proměnná nebude nastavena, takže ji musíte také zkontrolovat. Toto pole musíte zpracovat a vložit každý prvek jako nový řádek do tabulky activities_per_donor
Jak uložit více zaškrtávacích políček pomocí PDO
Většinu času byste k interakci s databází používali PDO. Chcete-li vložit hodnoty, musíte provést připravený příkaz. Musíte vložit data dárců do jedné tabulky a jejich aktivity do druhé, což vyžaduje, abyste oba vložky zabalili do transakce.
$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();
}
Jak uložit více zaškrtávacích políček pomocí mysqli
Pokud musíte použít mysqli, stále můžete dosáhnout stejného s velmi podobným kódem. Ještě jednou zahájíme transakci a provedeme 2 připravené příkazy a poté ji zapíšeme do databáze.
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();
}