Las casillas de verificación representan una lista de valores. Un usuario puede seleccionar varias casillas de verificación, lo que significa que para cada registro de usuario puede tener una lista de valores. Por esta razón necesita otra tabla en su base de datos para almacenar estas opciones. De hecho, es posible que necesite tres tablas en total:donante de sangre, actividades, actividades_por_donante. Para obtener más información, consulte ¿Cuál es la mejor manera de almacenar valores de casilla de verificación en la base de datos MySQL?
Depende de usted cómo diseñar las tablas, pero sus actividades por donante deben tener al menos dos columnas:ID de usuario y actividad. También debe crear una clave principal compuesta en ambas columnas para evitar valores duplicados. La columna de actividad debe hacer referencia a su lista predefinida de actividades de la tercera tabla para que un usuario no pueda insertar una actividad no válida.
Cuando su formulario se crea correctamente y sus casillas de verificación se nombran como una matriz (es decir, name="act[]"
), recibirá una serie de seleccionados valores en PHP en $_POST['act']
variable. Si no se seleccionan valores, esta variable no se establecerá, por lo que también debe verificar eso. Debe procesar esta matriz e insertar cada elemento como una nueva fila en la tabla actividades_por_donante
Cómo almacenar múltiples casillas de verificación usando PDO
La mayoría de las veces estaría usando PDO para interactuar con la base de datos. Para insertar los valores que necesita para realizar una declaración preparada. Debe insertar los datos del donante en una tabla y sus actividades en otra, lo que requiere que incluya ambas inserciones en una transacción.
$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();
}
Cómo almacenar múltiples casillas de verificación usando mysqli
Si tiene que usar mysqli, aún puede lograr lo mismo con un código muy similar. Una vez más, comenzamos una transacción y realizamos 2 declaraciones preparadas y luego las ingresamos en la base de datos.
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();
}