Kontrollkästchen stellen eine Liste von Werten dar. Ein Benutzer kann mehrere Kontrollkästchen auswählen, was bedeutet, dass Sie möglicherweise für jeden Benutzerdatensatz eine Liste mit Werten haben. Aus diesem Grund benötigen Sie eine weitere Tabelle in Ihrer Datenbank, um diese Optionen zu speichern. Tatsächlich benötigen Sie möglicherweise insgesamt drei Tabellen:Blutspender, Aktivitäten, Aktivitäten_pro_Spender. Weitere Informationen finden Sie unter Was ist der beste Weg, um Kontrollkästchenwerte in der MySQL-Datenbank zu speichern?
Es liegt an Ihnen, wie Sie die Tabellen gestalten, aber Ihre activity_per_donor muss mindestens zwei Spalten haben:user_id und activity. Sie sollten auch einen zusammengesetzten Primärschlüssel für beide Spalten erstellen, um doppelte Werte zu vermeiden. Die Aktivitätsspalte sollte auf Ihre vordefinierte Liste von Aktivitäten aus der dritten Tabelle verweisen, damit ein Benutzer keine ungültige Aktivität einfügen kann.
Wenn Ihr Formular korrekt erstellt ist und Ihre Kontrollkästchen als Array benannt sind (z. B. name="act[]"
), dann erhalten Sie ein Array von ausgewählten Werte in PHP in $_POST['act']
Variable. Wenn keine Werte ausgewählt sind, wird diese Variable nicht gesetzt, also müssen Sie das auch überprüfen. Sie müssen dieses Array verarbeiten und jedes Element als neue Zeile in die tables_per_donor-Tabelle
So speichern Sie mehrere Kontrollkästchen mit PDO
Die meiste Zeit würden Sie PDO verwenden, um mit der Datenbank zu interagieren. Um die Werte einzufügen, müssen Sie eine vorbereitete Anweisung ausführen. Sie müssen die Spenderdaten in eine Tabelle einfügen und ihre Aktivitäten in eine andere, was erfordert, dass Sie beide Einfügungen in eine Transaktion einschließen.
$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();
}
So speichern Sie mehrere Kontrollkästchen mit mysqli
Wenn Sie mysqli verwenden müssen, können Sie dasselbe mit einem sehr ähnlichen Code erreichen. Noch einmal starten wir eine Transaktion und führen 2 vorbereitete Anweisungen aus und übertragen sie dann in die Datenbank.
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();
}