Клетките за отметка представляват списък със стойности. Потребителят може да постави множество квадратчета за отметка, което означава, че за всеки потребителски запис може да имате списък със стойности. Поради тази причина се нуждаете от друга таблица във вашата база данни, за да съхранявате тези опции. Всъщност може да ви трябват общо три таблици:кръводарител, дейности, дейности_на_донор. За повече информация вижте Какъв е най-добрият начин да съхранявате стойностите на квадратчетата за отметка в MySQL база данни?
От вас зависи как ще проектирате таблиците, но вашите activities_per_donor трябва да имат поне две колони:user_id и activity. Трябва също така да създадете съставен първичен ключ в двете колони, за да избегнете дублиращи се стойности. Колоната за активност трябва да препраща към вашия предварително дефиниран списък с дейности от третата таблица, така че потребителят да не може да вмъкне невалидна дейност.
Когато вашият формуляр е създаден правилно и вашите квадратчета за отметка са наименувани като масив (т.е. name="act[]"
) тогава ще получите масив от избрани стойности в PHP в $_POST['act']
променлива. Ако не са избрани стойности, тази променлива няма да бъде зададена, така че трябва да проверите и това. Трябва да обработите този масив и да вмъкнете всеки елемент като нов ред в таблицата activities_per_donor
Как да съхранявате множество квадратчета за отметка с помощта на PDO
През повечето време ще използвате PDO за взаимодействие с базата данни. За да вмъкнете стойностите, трябва да изпълните подготвен оператор. Трябва да вмъкнете данните за донорите в една таблица и техните дейности в друга, което изисква да обвиете и двете вмъквания в транзакция.
$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();
}
Как да съхранявате множество квадратчета за отметка с помощта на mysqli
Ако трябва да използвате mysqli, все още можете да постигнете същото с много подобен код. Още веднъж стартираме транзакция и изпълняваме 2 подготвени оператора и след това я записваме в базата данни.
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();
}