¿Cómo insertar datos múltiples desde una lista/menú a un campo separados con como en idioma PHP?

Ayudenme! He escrito a muchos foros y nadie me ayuda, mi pregunta como inserto datos múltiples desde una lista/menu a un campo separando los datos con coma. He intentado con la función implode y nada...
Acá les dejo el código...
<form action="" method="get" name="forcrea" id="forcrea" >
<?php
$link=obtenerConexion();
$sql = 'SELECT * FROM procesos';
$resultado = mysql_query($sql,$link);
$num_rows = mysql_num_rows($resultado);
?>
<td nowrap="nowrap"><span class="Estilo20 Estilo39">
<label>
<select onchange="get_name_from_list()" name="names_list[]" class="Estilo20" id="names_list" size="1" multiple="multiple">
<option value="<?php echo $_GET['pro']; ?>">seleccione</option>
<?php
for($i=0; $i <$num_rows; $i++)
{
$fila = mysql_fetch_array($resultado);
echo "<option value=".$fila['id'].">".$fila["proceso"]."</option>";
}
// mysql_free_result($resultado);
// mysql_close($link);
?>
</select>
<input type="texto" size="5" name="id" id="id"/>
<input type="texto" size="35" name="pro" id="pro" />
</label>
</span></td>
<?php
$controlguardarcrea=$_GET['ocultoguardarcrea'];
if ($controlguardarcrea=='SI')
{
$link=obtenerConexion();
if(!empty($_GET['pro'])) {
$aLista=array_keys($_GET['pro']);
$sQuery = "INSERT INTO subprocesos(subproceso) VALUES ('" . $_GET['pro'] . "') WHERE id IN (".implode(',',$aLista).")";
$result = mysql_query($sQuery,$link);
$mensaje="Datos Almacenados Correctamente";
}
}
echo $sQuery;
?>
<?php
echo $mensaje;
?>
<input name="ocultocodcrea" type="hidden" />
<input name="ocultoguardarcrea" type="hidden">
<label>
<input type="submit" name="button" id="button" value="Enviar" onClick="javascript:guardarcrea();">
</label>

1 respuesta

Respuesta
1
Lo que ocurre es que la construcción de la sentencia SQL es incorrecta:
$sQuery = "INSERT INTO subprocesos(subproceso) VALUES ('" . $_GET['pro'] . "') WHERE id IN (".implode(',',$aLista).")";
En la tabla subprocesos estás intentando insertar valores en el campo subproceso (aparentemente), lo cual admitiría un valor en VALUES.
El WHERE no forma parte de una sentencia INSERT correcta en este caso.
Si explicas la estructura de la tabla, podría ser de más ayuda.
Hola, gracias por responder, el problema es el siguiente, tengo un formulario, tiene lista menu simples donde envío los datos a un campo de una tabla, pero al intentar enviar más de dos no me lo permite o sea la idea es insertar varios registros en el mismo campo separados por coma en este caso el campo es subproceso. Y lo que quiero insertar en este caso son varios procesos ("pro"), he leído sobre la función implode() pero no me funciona e igual con for/foreach() tampoco por favor ayudame!
En este caso, la sentencia SQL debería ser:
$sQuery = "INSERT into subprocesos(subproceso) VALUES('" . implode(',',$aLista) . "')";
Hola, gracias por responder, queda así...
<?php
$controlguardarcrea=tiny_mce_markerGET['ocultoguardarcrea'];
if ($controlguardarcrea=='SI')
{
$link=obtenerConexion();
if(!empty(tiny_mce_markerGET['pro'])) {
$aLista=array_keys(tiny_mce_markerGET['pro']);
$sQuery = "INSERT INTO subprocesos(subproceso) VALUES ('".implode(',',$aLista)."')";
$result = mysql_query($sQuery,$link);
$mensaje="Datos Almacenados Correctamente";
}
}
echo $sQuery;
?>
<?php
echo $mensaje;
?>
<input name="ocultocodcrea" type="hidden" />
<input name="ocultoguardarcrea" type="hidden">
pero, lo que me imprime es un cero....... ni siquiera una cadena de ceros.... un solo cero, sin embargo si al array_keys le quito el keys, solo me imprime la palabra array, estuve todo el fin lidiando con eso y nada, si ves cual es el error te lo agradeceria. :(
Para empezar parece que la asignación de $aLista es incorrecta. La estás llenando con los datos de la casilla Pro en lugar de los datos de la casilla de selección múltiple.
Debería ser:
$aLista = $_GET["names_list"];
Hola, ¿si efectivamente esa debería ser la asignación pero en principio comencé así y el resultado es que no guarda nada o sea guarda un espacio en blanco... por eso le asigne el "pro" porque así la cosa es diferente... oye no conocerás otra forma de guardar múltiples registros? Esto me esta volviendo loca, pro fa te lo agradecería de todas formas si encuentro la solución yo te avisaría.
La forma que te digo es la correcta y debería funcionar. Puedes comprobar qué está pasando fijándote en la dirección URL resultante en la barra de direcciones. Allí deberían aparecer los distintos valores.
A todo esto, supongo que en el formulario de la Select, seleccionas varias opciones antes de enviar el formulario, es decir, con la tecla Control pulsada, haces click en varias opciones y las dejas marcadas de color azul. Si no haces esto, no estás haciendo una selección múltiple.
Si sigue sin funcionarte, envíame el código actual y lo probaré.
<?php
include ("conexion.php");
?>
<script type="text/javascript">
function get_name_from_list(){
if(document.getElementById('names_list')){
if(document.getElementById('id')){
if(document.getElementById('pro')){
var id = document.getElementById('names_list').options[document.getElementById('names_list').selectedIndex].value;
var pro = document.getElementById('names_list').options[document.getElementById('names_list').selectedIndex].text;
document.getElementById('id').value=id;
document.getElementById('pro').value=pro;
}else{alert('Element pro not found!!!');}
}else{alert('Element id not found!!!');}
}else{alert('Element names_list not found!!!');}
}
</script>
<script language="javascript">
function guardarcrea()
{
if (document.forcrea.pro.value != "" )
{
document.forcrea.ocultoguardarcrea.value='SI';
document.forcrea.submit();
}
else
{
alert ("Dato en Blanco, Imposible Agregar..")
document.forcrea.pro.focus()
return;
}
}
</script>
<form action="" method="get" name="forcrea" id="forcrea" >
<?php
$link=obtenerConexion();
$sql = 'SELECT * FROM procesos';
$resultado = mysql_query($sql,$link);
$num_rows = mysql_num_rows($resultado);
?>
<td nowrap="nowrap"><span class="Estilo20 Estilo39">
<label>
<select onchange="get_name_from_list()" name="names_list[]" class="Estilo20" id="names_list" size="1" multiple="multiple">
<option value="<?php echo $_GET['pro']; ?>">seleccione</option>
<?php
for($i=0; $i <$num_rows; $i++)
{
$fila = mysql_fetch_array($resultado);
echo "<option value=".$fila['id'].">".$fila["proceso"]."</option>";
}
// mysql_free_result($resultado);
// mysql_close($link);
?>
</select>
<input type="texto" size="5" name="id" id="id"/>
<input type="texto" size="35" name="pro" id="pro" />
</label>
</span></td>
<?php
$controlguardarcrea=$_GET['ocultoguardarcrea'];
if ($controlguardarcrea=='SI')
{
$link=obtenerConexion();
if(!empty($_GET['names_list']))
{
$aLista=array($_GET['names_list']);
$sQuery="INSERT into subprocesos (subproceso) VALUES ('".implode(',',$aLista)."')";
$result = mysql_query($sQuery,$link);
$mensaje="Datos Almacenados Correctamente";
}
}
echo $sQuery;
?>
<?php
echo $mensaje;
?>
<input name="ocultocodcrea" type="hidden" />
<input name="ocultoguardarcrea" type="hidden">
<label>
<input type="submit" name="button" id="button" value="Enviar" onClick="javascript:guardarcrea();">
</label>
/////Esto lo hago para visualizar con facilidad si se esta guardando en la tabla subproceso como deseoooooooooo.
<?php
$link=obtenerConexion();
$sql = 'SELECT * FROM subprocesos';
$resultado = mysql_query($sql,$link);
$num_rows = mysql_num_rows($resultado);
?>
<td nowrap="nowrap"><span class="Estilo20 Estilo39">
<label>
<select onchange="get_name_from_list()" name="names_list" class="Estilo20" id="names_list" size="1">
<option value="<?php echo $_GET['subpro']; ?>">seleccione</option>
<?php
for($i=0; $i <$num_rows; $i++)
{
$fila = mysql_fetch_array($resultado);
echo "<option value=".$fila['idsub'].">".$fila["subproceso"]."</option>";
}
// mysql_free_result($resultado);
// mysql_close($link);
?>
</select>
</form>
Este es el código pruébalo por favor... te agradezco la paciencia que has tenido. Espero tu ayuda, gracias de antemano.
Para empezar te recomendaría que enviases el formulario por método POST en lugar de GET, porque éste último está limitado en cantidad de la información que se puede enviar.
En segundo lugar, debes cambiar la asignación de $aLista, debería ser:
$aLista=$_GET['names_list'];
No tienes que convertir en array lo que ya es un array. Con esto la inserción debería ser correcta.
Hola, solo me guarda el primer registro seleccionado, oye si probaras el código fuese diferente pruébalo, ya la mayoría de las cosas que me dices ya las he hecho, por favor pruébalo y ayudame... gracias
Hola, sigo esperando tu respuesta... la necesito.
Para poder probar el código, necesitaría tu fichero conexión.php
Y una copia de la base de datos. Si no, el código no funciona.
Sinceramente, gracias creo que estas dando muchas vueltas para ayudarme, ¿no es posible que me pidas la base de datos para que? ¿Si esa prueba la puedes hacer con cualquier ejemplo que tengas... de enviarla lo puedo hacer pero para que me digas otra cosa y no me des la ayuda que espero? Olvidalo,
Siento tu enfado. Verás, recibo muchas preguntas diariamente para contestar y me queda poco tiempo para probar códigos específicos si no vienen preparados para ejecutarse.
Claro que podría crear una base de datos, adaptar el código a ésta, después repasar el código y encontrar lo que no funciona (que de hecho es tu cometido), pero eso me hace perder mucho tiempo y tengo que repartirlo entre las otras personas que tienen dudas y preguntas.
Creo que para estar ofreciendo ayuda de forma totalmente desinteresada te he pedido muy poco.
En España tenemos una frase popular que dice: "Ayudate y te ayudarán".
Lamento tu actitud, pero si quieres que lo olvide, así lo haré.
Bueno, como se dice aquí, por uno pagan todos, lo que paso es que este problema lo he tenido y en otros foros después de tantas cosas me dicen que no me pueden ayudar, disculpa olvidalo.
Acá te dejo el fichero

<?php
function obtenerConexion()
{
// ===
// Al ejecutar la instrucción mysql_connect creamos un vínculo
// entre la base de datos y la pagina PHP,
// este vínculo será usado posteriormente en las consultas
// que se haga a la base de datos.
// ===
$url = "localhost"; // localhost indica que la base de datos esta en el
// mismo equipo donde se encuentra la aplicacion
$usuario = "root"; // Usuario por defecto
$contrasena = ""; // Sin contraseña
$nombreBaseDeDatos = "sig"; // Nombre de la base de datos
if (!($conexion=mysql_connect($url,$usuario,$contrasena)))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db($nombreBaseDeDatos,$conexion))
{
echo "Error seleccionando la base de datos.";
exit();
}
return $conexion;
}
//$conexion=obtenerConexion();
//echo "lo logre";
// mysql_close($conexion); // cierra la conexion
?>
¿Ahora si te digo no existe un adjuntador de archivos como te envío una copia de la base de datos? No veo manera, disculpa pero no se como enviarl.
Estoy intentado ejecutar tu código, pero sin una descripción de las tablas y sin una descripción de lo que quieres hacer, no es posible.
Veo que parece que tienes una tabla proceso y otra tabla suprocesos. ¿Qué estructura tienen? ¿Qué relación tienen los datos de una con la otra? ¿Y qué es lo que deseas que haga el código?
Para mostrar la estructura de la tabla, en phpAdmin puedes hacer Exportar y el resultado lo puedes pegar aquí.
Al final he ido deduciendo los campos, etc. aunque me ha llevado mi tiempo.
Básicamente los errores que tenías eran usar mysql_fetch_array en lugar de mysql_fetch_assoc, dar un size=1 en la select, lo que imposibilita seleccionar varias opciones y, sobre todo, tener dos selects con el mismo name y el mismo id.
Aquí tienes el código corregido:
<script type="text/javascript">
function get_name_from_list(){
if(document.getElementById('names_list')){
if(document.getElementById('id')){
if(document.getElementById('pro')){
var id = document.getElementById('names_list').options[document.getElementById('names_list').selectedIndex].value;
var pro = document.getElementById('names_list').options[document.getElementById('names_list').selectedIndex].text;
document.getElementById('id').value=id;
document.getElementById('pro').value=pro;
}else{alert('Element pro not found!!!');}
}else{alert('Element id not found!!!');}
}else{alert('Element names_list not found!!!');}
}
</script>
<script language="javascript">
function guardarcrea()
{
if (document.forcrea.pro.value != "" )
{
document.forcrea.ocultoguardarcrea.value='SI';
document.forcrea.submit();
}
else
{
alert ("Dato en Blanco, Imposible Agregar..")
document.forcrea.pro.focus()
return;
}
}
</script>
<form action="" method="get" name="forcrea" id="forcrea" >
<?php
$link=obtenerConexion();
$sql = 'SELECT * FROM procesos';
$resultado = mysql_query($sql,$link);
$num_rows = mysql_num_rows($resultado);
?>
<td nowrap="nowrap"><span class="Estilo20 Estilo39">
<label>
<select onchange="get_name_from_list()" name="names_list[]" class="Estilo20" id="names_list" size="10" multiple="multiple">
<option value="<?php echo $_GET['pro']; ?>">seleccione</option>
<?php
for($i=0; $i<$num_rows; $i++)
{
$fila = mysql_fetch_assoc($resultado);
echo '<option value="'.$fila['id'].'">'.$fila["proceso"].'</option>';
}
// mysql_free_result($resultado);
// mysql_close($link);
?>
</select>
<input type="texto" size="5" name="id" id="id"/>
<input type="texto" size="35" name="pro" id="pro" />
</label>
</span></td>
<?php
$controlguardarcrea=$_GET['ocultoguardarcrea'];
if ($controlguardarcrea=='SI')
{
$link=obtenerConexion();
if(!empty($_GET['names_list']))
{
$aLista=$_GET['names_list'];
$sQuery="INSERT into subprocesos (subproceso) VALUES ('".implode(',',$aLista)."')";
$result = mysql_query($sQuery,$link);
$mensaje="Datos Almacenados Correctamente";
}
}
echo $sQuery;
?>
<?php
echo $mensaje;
?>
<input name="ocultocodcrea" type="hidden" />
<input name="ocultoguardarcrea" type="hidden">
<label>
<input type="submit" name="button" id="button" value="Enviar" onClick="javascript:guardarcrea();">
</label>
<?php
/////Esto lo hago para visualizar con facilidad si se esta guardando en la tabla subproceso como deseoooooooooo.
$link=obtenerConexion();
$sql = 'SELECT * FROM subprocesos';
$resultado = mysql_query($sql,$link);
$num_rows = mysql_num_rows($resultado);
?>
<td nowrap="nowrap"><span class="Estilo20 Estilo39">
<label>
<select onchange="get_name_from_list()" name="subprocesos" class="Estilo20" id="subprocesos" size="10">
<option value="<?php echo $_GET['subpro']; ?>">seleccione</option>
<?php
for($i=0; $i <$num_rows; $i++)
{
$fila = mysql_fetch_array($resultado);
echo "<option value=".$fila['idsub'].">".$fila["subproceso"]."</option>";
}
// mysql_free_result($resultado);
// mysql_close($link);
?>
</select>
</label></span>
</form>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas