Foros del Web » Programando para Internet » PHP »

CodeIgniter Al insertar los datos de un select multiple solo se guarda un valor en la db

Estas en el tema de Al insertar los datos de un select multiple solo se guarda un valor en la db en el foro de PHP en Foros del Web. Hola gente! Ando con un problema y ya se me acabaron las ideas :( busque info en internet pero no me sirvio, y otras cosas ...
  #1 (permalink)  
Antiguo 10/08/2014, 17:19
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Al insertar los datos de un select multiple solo se guarda un valor en la db

Hola gente!
Ando con un problema y ya se me acabaron las ideas :( busque info en internet pero no me sirvio, y otras cosas que encontre no las entendi.
Resulta que en un formulario tengo un select, donde el usuario puede seleccionar multiples valores a la vez, el codigo en la vista seria algo asi:
Código PHP:
<div class="form-group">
    <?php echo form_label('Idiomas soportados''lang'); ?>
    <?php $options = array('Ingles' => 'Ingles','Español' => 'Español''Portugués' => 'Portugués''Ruso' => 'Ruso''Francés' => 'Francés''Alemán' => 'Alemán''Italiano' => 'Italiano'); $attribute ='class="selectpicker show-tick form-control" multiple title="Seleccione los lenguajes..."'; echo form_dropdown('lang[]'$options'title',$attribute); ?>
</div>
Esto en el navegador se ve asi por ejemplo:


En el controlador valido los campos y luego los paso al modelo, por ejemplo asi:
Código PHP:
[...]
$langs '';
            foreach (
$this->input->post('lang') as $lang)
            {
                
$langs .= "$lang, ";
            }
            
$langs rtrim ($lang", ");
[...]

$insert $this->user_model->new_post($langs); 
El problema es que en la base de datos solo se guarda Un solo valor, siemre se guarda el ultimo valor que el usuario selecciono, en este caso el ultimo valor es "Español" asique en la base de datos solo figura "Español" y no los 3 idiomas seleccionados.
Como puedo hacer que se guarden los todos los valores ?

Tambien intente validarlo con esto y luego mandarlo al modelo:
Código PHP:
$this->form_validation->set_rules('lang''Idiomas''trim|required|xss_clean'); 
Pero tampoco funciono.
Por si las dudas aclaro que estoy usando boostrap para el front end y ademas una customizacion para los selects de boostrap que es este:
[URL="http://silviomoreto.github.io/bootstrap-select/"]http://silviomoreto.github.io/bootstrap-select/[/URL]

Alguien podria explicarme como hacerlo?

Cambie el tipo de campo en la base de datos pero tampoco era eso
  #2 (permalink)  
Antiguo 11/08/2014, 10:16
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Al insertar los datos de un select multiple solo se guarda un valor en la

probe con:
Código PHP:
$this->form_validation->set_rules('lang[]''Idiomas''trim|required|xss_clean'); 
y tampoco me funciono. alguno tiene idea de como hacerlo ?
  #3 (permalink)  
Antiguo 11/08/2014, 10:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Al insertar los datos de un select multiple solo se guarda un valor en la

Cita:
El problema es que en la base de datos solo se guarda Un solo valor, siemre se guarda el ultimo valor que el usuario selecciono, en este caso el ultimo valor es "Español" asique en la base de datos solo figura "Español" y no los 3 idiomas seleccionados.
Como puedo hacer que se guarden los todos los valores ?
A nivel de base de datos, deberás tener una tabla que relacione el post o el usuario (no entiendo bien qué es lo que relacionas con los idiomas) con cada uno de los ID de cada idioma soportable.
Luego de eso, en la aplicación deberás poder iterar (recorrer) la lista de idiomas soportados y realizar en esa tabla dependiente, una entrada por cada idioma que esa entidad se relaciona.
Tienes una opción que sería serializar esos datos e insertarlos en un campo VARCHAR, pero eso a nivel de Bases de Datos es un espanto prohibido...
En otras palabras, depende de como lo queras implementar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 11/08/2014, 12:01
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Al insertar los datos de un select multiple solo se guarda un valor en la

Hola gnzsoloyo, gracias por contestar.
Mira el tema es asi:
Un usuario crea un post donde puede seleccionar los idoimas que habla.
entonces despues en una vista yo queria mostrar por ejemplo:

Juan es de Argentina y habla tantos idiomas..

por eso queria que se guarden todos los valores del select en una misma tabla, esta mal ?
  #5 (permalink)  
Antiguo 11/08/2014, 12:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Al insertar los datos de un select multiple solo se guarda un valor en la

Cita:
por eso queria que se guarden todos los valores del select en una misma tabla, esta mal ?
A nivel de programación, parece una buena idea. Pero a nivel de datos, no. Es incorrecto porque tienes N usuarios relacionado con N idiomas, y eso forzosamente se hace al menos en tres tablas, una para el usuario, otra para los idiomas y una que relacione ambos. De ese modo no se producen redundancias nocivas en la tabla usuarios ni en la de idiomas de usuario.
Adicionalmente la de paises evitaría tener que ingresar manualmente el nombre de cada pais en cada usuario. Lo haces por tabla de parametros fija y listo.
La cantidad de idiomas (con o sin discriminación) se obtiene a partir de una consulta.

Es un tema más para BBDD que para PHP, en realidad.
Cita:
Usuario(id_usuario, nombre, apellido, pais_id, otros datos...)
idiomas(id_idioma, denominacion)
pais(pais_id, nombre_pais)
Idiomas_usuario(id_usuario, id_idioma)
En MySQL sería as o menos así:
Código MySQL:
Ver original
  1. SELECT CONCAT(nombre, ' es de ', nombre_pais , 'y habla ', idiomas, ' idiomas') datosUsuario
  2.     (SELECT U.nombre, P.pais, COUNT(IU.id_idioma) idiomas
  3.     FROM usuarios U INNER JOIN pais P ON U.pais_id = P.pais_id
  4.         LEFT JOIN idiomas_usuario IU ON U.usario_id = I.usuario_id
  5.     GROUP BY usuario_id) tabla;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: codeigniter, formulario, select, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:37.