Insertar select múltiple a MySQL
Al trabajar con etiquetas SELECT suele llegar al punto de como Insertar select múltiple a MySQL, en este articulo detallaremos varias opciones: implode() o FOREACH,
Cómo hacer un INSERT INTO de un select múltiple
A continuación, veremos las diferentes opciones que podemos realizar
Crear formulario HTML
Lo primero será crear un formulario HTML y declarar los atributos correctos, por ejemplo, agregar corchetes al atributo NAME
de nuestra etiqueta select
Veamos un ejemplo
<form method="POST" action="">
<div class="form-group row">
<div class="col-md-12">
<label for="exampleFormControlInput1">Seleccione animales</label>
<select class="form-control basico" multiple="multiple" name="animales[]"
style="width: 100%">
<option value="Perro">Perro</option>
<option value="Gato">Gato</option>
<option value="Loro">Loro</option>
</select>
</div>
</div>
<button class="btn btn-primary" name="enviar">Procesar</button>
</form>
Procesar el SELECT múltiple con PHP
Si deseamos insertar valores a una base de datos tenemos que usar un lenguaje de programación como PHP que nos brinda las funciones necesarias para lograr nuestro objetivo.
Un detalle importante es la conexión con mysql
Existen varias formas para guardar un valor o un conjunto de valores en un campo de una tabla de la base de datos. Por lo tanto, tienes que decidir primero qué opción usar.
Nota:
Hay que tener en cuenta que la decisión tomada dependerá no sólo cómo tienes que insertar los datos, sino también cómo recuperarlos luego en modo de edición.
Insertar Datos en múltiples registros
Para almacenar en varios registros la cantidad de elementos seleccionados de una etiqueta select múltiple debemos de apoyarnos en el bucle foreach.
Veamos el código completo y tendrá de nombre insertar_foreach_multiple_seect.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- Declaramos libreria Select2 -->
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
</head>
<body>
<div class="container-fluid mt-3">
<div class="card">
<h5 class="card-header">Insertar valores de select mutiple a MySQL</h5>
<div class="card-body">
<form method="POST" action="">
<div class="form-group row">
<div class="col-md-12">
<label for="exampleFormControlInput1">Seleccione animales</label>
<select class="form-control basico" multiple="multiple" name="animales[]"
style="width: 100%">
<option value="Perro">Perro</option>
<option value="Gato">Gato</option>
<option value="Loro">Loro</option>
</select>
</div>
</div>
<button class="btn btn-primary" name="enviar">Procesar</button>
</form>
</div>
<div class="card-footer">
<p class="card-title">Resultados</p>
<p class="text-muted">
<?php
$usuario = "root";
$password = "root";
//Conexion MySQL PDO
$bd = new PDO('mysql:host=localhost;dbname=db_ejemplos', $usuario, $password);
if(!empty($_POST["animales"])) {
foreach($_POST['animales'] as $key) {
//Save MySQL
$query = $bd->prepare("INSERT INTO `tbl_mascotas`(`mascotas`)
VALUES (:mascotas)");
$query->bindParam(":mascotas", $key);
$query->execute();
if ($query->rowCount() > 0){
echo "Se guardo con exito<br>";
}else{
echo "Hubo un error<br>";
}
//End: Save MySQL
}
}
?>
</p>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$('.basico').select2();
});
</script>
</body>
</html>
Guardar a MySQL valores de select múltiple en un registro
Para lograr este objetivo debemos de usar la función IMPLODE() de PHP para que concatene con comas los múltiples valores del select
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- Declaramos libreria Select2 -->
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
</head>
<body>
<div class="container-fluid mt-3">
<div class="card">
<h5 class="card-header">Insertar en un solo registro valores de select mutiple</h5>
<div class="card-body">
<form method="POST" action="">
<div class="form-group row">
<div class="col-md-12">
<label for="exampleFormControlInput1">Seleccione animales</label>
<select class="form-control basico" multiple="multiple" name="animales[]"
style="width: 100%">
<option value="Perro">Perro</option>
<option value="Gato">Gato</option>
<option value="Loro">Loro</option>
</select>
</div>
</div>
<button class="btn btn-primary" name="enviar">Procesar</button>
</form>
</div>
<div class="card-footer">
<p class="card-title">Resultados</p>
<p class="text-muted">
<?php
$usuario = "root";
$password = "root";
//Conexion MySQL PDO
$bd = new PDO('mysql:host=localhost;dbname=db_ejemplos', $usuario, $password);
if(!empty($_POST["animales"])) {
//Save MySQL
$mis_mascotas = implode(', ', $_POST["animales"]);
$query = $bd->prepare("INSERT INTO `tbl_mascotas`(`mascotas`)
VALUES (:mascotas)");
$query->bindParam(":mascotas", $mis_mascotas);
$query->execute();
if ($query->rowCount() > 0){
echo "Se guardo con exito<br>";
}else{
echo "Hubo un error";
}
//End: Save MySQL
}
?>
</p>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$('.basico').select2();
});
</script>
</body>
</html>
Otras Opciones para insertar a MySQL
Estas opciones serán claves para ver que tipo o forma de almacenamiento deseamos.
Separar con Implode()
Una opción sencilla es meter los valores separados por coma usando la función impode():
$mascotas = implode(',', $_POST['animales']);
Serializar con función serialize()
Otra es serializar el conjunto o valores seleccionados del select múltiple
$mascotas = serialize($_POST['animales']);
Agrupar con json_encode()
Otra opción y también muy utilizada es a de concatenar usando la funcion json_encode()
$mascota = json_encode($_POST['animales']);
Para finalizar
Existe una opción para cada necesidad y es menester de cada uno elegir las opciones más adecuada según sea el caso. Sin embargo, en general interesa valores separados por coma para conjuntos de valores muy simples, y fáciles de recuperar.