As caixas de seleção representam uma lista de valores. Um usuário pode selecionar várias caixas de seleção, o que significa que, para cada registro de usuário, você pode ter uma lista de valores. Por esse motivo, você precisa de outra tabela em seu banco de dados para armazenar essas opções. Na verdade, você pode precisar de três tabelas no total:doador de sangue, atividades, atividades_per_doador. Para obter mais informações, consulte Qual é a melhor maneira de armazenar valores de caixa de seleção no banco de dados MySQL?
Depende de você como você projeta as tabelas, mas seu activity_per_donor precisa ter pelo menos duas colunas:user_id e activity. Você também deve criar uma chave primária composta em ambas as colunas para evitar valores duplicados. A coluna de atividade deve fazer referência à sua lista predefinida de atividades da terceira tabela para que um usuário não possa inserir uma atividade inválida.
Quando seu formulário é criado corretamente e suas caixas de seleção são nomeadas como uma matriz (ou seja,
name="act[]"
), você receberá uma matriz de selecionados valores em PHP em $_POST['act']
variável. Se nenhum valor for selecionado, essa variável não será definida, então você precisa verificar isso também. Você precisa processar essa matriz e inserir cada elemento como uma nova linha na tabela Activities_per_donor Como armazenar várias caixas de seleção usando PDO
Na maioria das vezes você estaria usando o PDO para interagir com o banco de dados. Para inserir os valores, você precisa executar uma instrução preparada. Você precisa inserir os dados do doador em uma tabela e suas atividades em outra, o que requer que você envolva ambas as inserções em uma transação.
$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();
}
Como armazenar várias caixas de seleção usando mysqli
Se você tiver que usar o mysqli, ainda poderá conseguir o mesmo com um código muito semelhante. Mais uma vez, iniciamos uma transação e executamos 2 instruções preparadas e, em seguida, confirmamos no banco de dados.
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();
}