Foros del Web » Programando para Internet » PHP »

Duda con INSERT múltiple

Estas en el tema de Duda con INSERT múltiple en el foro de PHP en Foros del Web. Hola a todos, estoy programando un sistema para crear encuestas y para dicho script he creado 2 tablas en MySQL: encuestas id_enc pregunta encuestas_opt id_opt ...
  #1 (permalink)  
Antiguo 25/10/2007, 21:57
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
Duda con INSERT múltiple

Hola a todos, estoy programando un sistema para crear encuestas y para dicho script he creado 2 tablas en MySQL:

encuestas
id_enc
pregunta

encuestas_opt
id_opt
opciones
num_votos
id_enc

El script completo es el siguiente:

Código PHP:
<?php
    
include('config.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Encuestas</title>
<meta name="distribution" content="global" />
<meta name="robots" content="all" />
<style type="text/css">
body {
    font-family: 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; /* Tahoma,Verdana, sans-serif*/
    Font-size: 10pt;
    background: #fff;
    padding: 0;
    margin: 0;
}
a.link {
    color: #0066cc;
    text-decoration: none;
}
a.link:hover {
    text-decoration: underline;
}
.file {
    display: block;
}
label {
    display: block;
}
span a {
    margin-left: 1em;
}
</style>
<script type="text/javascript">
var numero = 0;

// Funciones comunes
c = function (tag) { // Crea un elemento
   return document.createElement(tag);
}
d = function (id) { // Retorna un elemento en base al id
   return document.getElementById(id);
}
e = function (evt) { // Retorna el evento
   return (!evt) ? event : evt;
}
f = function (evt) { // Retorna el objeto que genera el evento
   return evt.srcElement ?  evt.srcElement : evt.target;
}

addField = function () {
   container = d('files');
   
   span = c('SPAN');
   span.className = 'file';
   span.id = 'file' + (++numero);

   field = c('INPUT');   
   field.name = 'opciones[]';
   field.type = 'text';
   
   a = c('A');
   a.name = span.id;
   a.href = '#';
   a.onclick = removeField;
   a.innerHTML = 'Quitar';

   span.appendChild(field);
   span.appendChild(a);
   container.appendChild(span);
}
removeField = function (evt) {
   lnk = f(e(evt));
   span = d(lnk.name);
   span.parentNode.removeChild(span);
}
</script>
</head>
<body>
    <?php
        
//Preguntamos si nuetro arreglo 'archivos' fue definido
        
if(isset($_POST['enviar'])) {
            if(
$_POST['pregunta'] == '') {
                echo 
"No has ingresado la pregunta de la encuesta. <a class='link' href='javascript:history.back()'>Regresar</a>";
            }else {
                
$pregunta strip_tags($_POST['pregunta']);
                
mysql_query("INSERT INTO encuestas (pregunta) VALUES('".$pregunta."')");
                
$id_enc mysql_insert_id();
                
$cont '1';
                
$cant count($_POST['opciones']);
                while(
$cont <= $cant){
                      
$opciones $opciones["$cont"];
                      
$sql mysql_query("INSERT INTO encuestas_opt (opciones, id_enc) VALUES ('$opciones', '$id_enc')");
                      
$cont++;
                }
                echo 
"exito";
            }
        }else {
    
?>
    <form name="frm" id="frm" action="pruebafrm.php" method="post">
        <label>T&iacute;tulo de la encuesta:</label>
        <input type="text" name="pregunta" size="30" /><br />
        <label>Opciones:</label>
        <a class="link" href="#" onclick="addField()" accesskey="5">Añadir opciones</a>
        <div id="files"></div>
        <input type="submit" value="Guardar datos" id="envia" name="enviar" />
    </form>
    <?php
        
}
    
?>
</body>
</html>
Ahora paso a explicar como trabaja el script, el javascript lo que hace es ir generando controles "input text" según las opciones que se vayan a añadir a una determinada encuesta, una vez enviados los datos hago una validación para saber si se ha ingresado el título de la encuesta, luego paso a hacer el primer INSERT en la tabla "encuestas" luego de ello declaro una variable para obtener la última id ingresada a MySQL en dicha tabla para usarla luego en el siguiente INSERT en la tabla "encuestas_opt", declaro una variable "$cont" y le asigno el valor "1" y otra variable "$cant" en la que cuento la cantidad de controles "input text" que contienen las opciones de la encuesta, luego hago un while comparando si $cont es menor o igual a $cant y finalmente hago el siguiente INSERT en bucle para ir ingresando en la tabla "encuestas_opt" las opciones y la id de la encuesta a la que pertenece, y aquí es donde me salta la duda y el problema y es que así como está el script, me inserta correctamente los datos en la tabla "encuestas" pero en la tabla "encuestas_opt" aparentemente lo hace bien, pero cuando checo en el phpMyadmin se aprecia que se han insertado en dicha tabla tantos registros como opciones se eligieron pero al entrar a ver los datos me muestra esto:

Voy a suponer que seleccioné 3 opciones(si, no y no opino; en ese orden), entonces enla tabla "encuestas_opt" muestra lo siguiente:



Si se dan cuenta sólo aparece la opción "no" y las demás filas ese campo aparece vacío. ¿Dónde puedo estar fallando?, espero que me puedan ayudar con ello, gracias de antemano.

Saludos
  #2 (permalink)  
Antiguo 26/10/2007, 01:40
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Re: Duda con INSERT múltiple

Los arrays en PHP empiezan en 0, y tu empiezas a leer desde el indice 1.

Haz un var_dump() o print_r() de $_POST para ver si lo que recibe el script es lo mismo que pensabas que iba a recibir.

Cargate el javascript y haz que te funcione el PHP con un formulario HTML normal, con 3 campos por ejemplo. Una vez que sabes que el PHP funciona, pon el javascript. Si el sistema vuelve a fallar, ya sabes que la culpa es del javascript y no del PHP (PHP nunca es el culpable).
  #3 (permalink)  
Antiguo 26/10/2007, 07:30
Avatar de andruqui  
Fecha de Ingreso: agosto-2007
Mensajes: 269
Antigüedad: 16 años, 8 meses
Puntos: 2
Re: Duda con INSERT múltiple

Estaria bueno agregar una tabla mas para saber que opcion voto cada usuario no ?

Saludos
Andres
  #4 (permalink)  
Antiguo 26/10/2007, 09:31
Avatar de ZydRick  
Fecha de Ingreso: febrero-2005
Ubicación: Lima
Mensajes: 750
Antigüedad: 19 años, 2 meses
Puntos: 4
Re: Duda con INSERT múltiple

Darkj hice lo que me dijiste sobre lo de fijarme si el script recogía correctamente los valores y estaba bien, además que la variable $opciones no la estaba relacionando con la matriz superglobal $_POST, también estaba iniciando mal el conteo del array que lo iniciaba de "1" cuando tenía que hacerlo desde "0", y finalmente en el while cambié "<=" por "<" y ahora va bien, gracias por la ayuda.

Saludos.

PD: andruqui, esa idea es buena, también la tengo presente, gracias
  #5 (permalink)  
Antiguo 02/11/2007, 12:21
Avatar de eddwinpaz  
Fecha de Ingreso: noviembre-2007
Ubicación: Merida , Venezuela
Mensajes: 1.066
Antigüedad: 16 años, 6 meses
Puntos: 25
Pregunta Re: Duda con INSERT múltiple

Aqui esta la solucion al problema espero que te sirva :D

CREATE TABLE `encuestas` (
`id_enc` int(11) NOT NULL auto_increment,
`pregunta` char(50) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id_enc`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

CREATE TABLE `encuestas_opt` (
`id_opt` int(11) NOT NULL auto_increment,
`opciones` char(50) collate latin1_general_ci NOT NULL,
`num_votos` int(3) NOT NULL,
`id_enc` int(11) NOT NULL,
PRIMARY KEY (`id_opt`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;


<?php
mysql_connect('localhost','root','');
mysql_select_db('pruebas');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Encuestas</title>
<meta name="distribution" content="global" />
<meta name="robots" content="all" />
<style type="text/css">
body {
font-family: 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; /* Tahoma,Verdana, sans-serif*/
Font-size: 10pt;
background: #fff;
padding: 0;
margin: 0;
}
a.link {
color: #0066cc;
text-decoration: none;
}
a.link:hover {
text-decoration: underline;
}
.file {
display: block;
}
label {
display: block;
}
span a {
margin-left: 1em;
}
</style>
<script type="text/javascript">
var numero = 0;

// Funciones comunes
c = function (tag) { // Crea un elemento
return document.createElement(tag);
}
d = function (id) { // Retorna un elemento en base al id
return document.getElementById(id);
}
e = function (evt) { // Retorna el evento
return (!evt) ? event : evt;
}
f = function (evt) { // Retorna el objeto que genera el evento
return evt.srcElement ? evt.srcElement : evt.target;
}

addField = function () {
container = d('files');

span = c('SPAN');
span.className = 'file';
span.id = 'file' + (++numero);

field = c('INPUT');
field.name = 'opciones[]';
field.type = 'text';

a = c('A');
a.name = span.id;
a.href = '#';
a.onclick = removeField;
a.innerHTML = 'Quitar';

span.appendChild(field);
span.appendChild(a);
container.appendChild(span);
}
removeField = function (evt) {
lnk = f(e(evt));
span = d(lnk.name);
span.parentNode.removeChild(span);
}
</script>
</head>
<body>
<?php
//Preguntamos si nuetro arreglo 'archivos' fue definido
if(isset($_POST['enviar'])) {
if($_POST['pregunta'] == '') {
echo "No has ingresado la pregunta de la encuesta. <a class='link' href='javascript:history.back()'>Regresar</a>";
}else {
$pregunta = strip_tags($_POST['pregunta']);
mysql_query("INSERT INTO encuestas (pregunta) VALUES('".$pregunta."')");
$id_enc = mysql_insert_id();
$cont = '0';
$cant = count($_POST['opciones']);
while($cont < $cant){
// $opciones = $opciones["$cont"];
$sql = mysql_query("INSERT INTO encuestas_opt (opciones, id_enc) VALUES ('".$_POST['opciones'][$cont]."', '".$id_enc."')");
$cont++;
}
echo "exito";
}
}else {
?>
<form name="frm" id="frm" method="post">
<label>T&iacute;tulo de la encuesta:</label>
<input type="text" name="pregunta" size="30" /><br />
<label>Opciones:</label>
<a class="link" href="#" onclick="addField()" accesskey="5">Añadir opciones</a>
<div id="files"></div>
<input type="submit" value="Guardar datos" id="envia" name="enviar" />
</form>
<?php
}
?>
</body>
</html>

Última edición por eddwinpaz; 02/11/2007 a las 15:00
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:28.