Le caselle di controllo rappresentano un elenco di valori. Un utente può selezionare più caselle di controllo, il che significa che per ogni record utente potresti avere un elenco di valori. Per questo motivo è necessaria un'altra tabella nel database per memorizzare queste opzioni. In effetti potresti aver bisogno di tre tabelle in totale:donatore di sangue, attività, attività_per_donatore. Per ulteriori informazioni, vedere Qual è il modo migliore per memorizzare i valori delle caselle di controllo nel database MySQL?
Sta a te decidere come progettare le tabelle, ma le tue attività_per_donatore devono avere almeno due colonne:user_id e attività. Dovresti anche creare una chiave primaria composita su entrambe le colonne per evitare valori duplicati. La colonna dell'attività dovrebbe fare riferimento all'elenco predefinito di attività della terza tabella in modo che un utente non possa inserire un'attività non valida.
Quando il modulo è stato creato correttamente e le caselle di controllo sono denominate come un array (ad esempio name="act[]"
) quindi riceverai una serie di selezionati valori in PHP in $_POST['act']
variabile. Se non vengono selezionati valori, questa variabile non verrà impostata, quindi è necessario verificare anche quello. Devi elaborare questo array e inserire ogni elemento come una nuova riga nella tabella attività_per_donatore
Come memorizzare più caselle di controllo utilizzando PDO
La maggior parte delle volte useresti PDO per interagire con il database. Per inserire i valori è necessario eseguire un'istruzione preparata. Devi inserire i dati del donatore in una tabella e le loro attività in un'altra, il che richiede di racchiudere entrambi gli inserti in una transazione.
$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();
}
Come memorizzare più caselle di controllo utilizzando mysqli
Se devi usare mysqli puoi comunque ottenere lo stesso risultato con un codice molto simile. Ancora una volta, avviamo una transazione ed eseguiamo 2 istruzioni preparate e quindi le inseriamo nel 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();
}