Pola wyboru reprezentują listę wartości. Użytkownik może zaznaczyć wiele pól wyboru, co oznacza, że dla każdego rekordu użytkownika możesz mieć listę wartości. Z tego powodu do przechowywania tych opcji potrzebna jest inna tabela w bazie danych. W rzeczywistości możesz potrzebować w sumie trzech tabel:Blooddonor, Activities, Activities_per_donor. Aby uzyskać więcej informacji, zobacz Jak najlepiej przechowywać wartości pól wyboru w bazie danych MySQL?
Od Ciebie zależy, w jaki sposób zaprojektujesz tabele, ale Twój activity_per_donor musi mieć co najmniej dwie kolumny:user_id i activity. Należy również utworzyć złożony klucz podstawowy w obu kolumnach, aby uniknąć zduplikowanych wartości. Kolumna aktywności powinna odnosić się do wstępnie zdefiniowanej listy działań z trzeciej tabeli, aby użytkownik nie mógł wstawić nieprawidłowej aktywności.
Gdy formularz jest poprawnie utworzony, a pola wyboru są nazwane jako tablica (np. name="act[]"
), otrzymasz tablicę wybranych wartości w PHP w $_POST['act']
zmienny. Jeśli nie wybrano żadnych wartości, ta zmienna nie zostanie ustawiona, więc musisz to również sprawdzić. Musisz przetworzyć tę tablicę i wstawić każdy element jako nowy wiersz do tabeli activity_per_donor
Jak przechowywać wiele pól wyboru za pomocą PDO
Przez większość czasu używałbyś PDO do interakcji z bazą danych. Aby wstawić wartości należy wykonać przygotowaną instrukcję. Musisz wstawić dane dawcy do jednej tabeli, a ich działania do drugiej, co wymaga umieszczenia obu wstawek w transakcji.
$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 przechowywać wiele pól wyboru za pomocą mysqli
Jeśli musisz użyć mysqli, nadal możesz osiągnąć to samo za pomocą bardzo podobnego kodu. Jeszcze raz rozpoczynamy transakcję i wykonujemy 2 przygotowane zestawienia, a następnie wprowadzamy je do bazy danych.
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();
}