PHP-Hispano.net Comunidad hispana de desarrollo web

Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?

1111 usuarios Online (0)

Darse de alta en la web | Recuperar password   
Inicio / Foros / MySQL / Tabla larga?

Tabla larga? [SOLUCIONADO]

6 respuestas 707 visitas Categoría MySQL

Tabla larga?

Avatar de RanuTo
* * * * * * *

(Nivel 2 - 48 posts)

#0 Offline RanuTo Usuario 09 feb 10
Holas, tengo un formulario muy largo que consiste en puros checkbox son como mas de 50, como si fuera un examen donde tickeas varias opciones.
Mi preunta es hay una mejor forma de almacenar estos datos en una tabla? lo que estaba haciendo ahora es poner cada campo que guardara el true o false de cada respuesta pero es la forma mas eficiente que se puede hacer?, si sigo haciendo la tabla va a ser muy larga.
gracias!

Re: Tabla larga?

Avatar de jurena
* * * * * * *

(Nivel 7 - 1645 posts)

#1 Offline jurena Moderador 09 feb 10
Se pueden hacer inserciones múltiples en la base, iteraciones en la inserción, etc., pero necesitamos más datos para ayudarte. Ponnos algún ejemplo de lo que tienes
Para una inserción múltiple con iteración, mira este post de panino, aunque no sé si te servirá.
http://www.php-hispano.net/foros/PHP/23592-insercion-de-multiples-registros-a-traves-de-un-f

SOLUCIÓN PuntuaciónPuntuaciónPuntuaciónRe: Tabla larga?

Avatar de Eloy8857
* * * * * * *

(Nivel 4 - 449 posts)

#2 Offline Eloy8857 Usuario 09 feb 10
Es mejor que tengas una tabla de opciones, donde puedes almacenar un ID y un nombre o texto para mostrar. Luego cada vez que se envíe el formulario guardarías en otra tabla el ID del usuario o lo que sea que envía el formulario, y el ID de la opción que ha elegido. De este modo, si marca 30 de 50 meterías 30 registros. Esa tabla tendría como clave primaria el ID de usuario + ID de opción, a no ser que permitas multiples envíos por usuario.

También puedes almacenar las opciones que no ha enviado, guardando en la tabla además un campo que indique el valor de la opción: 0 ó distinto de 0, true o false... eso ya depende de si te interesa o no.

Así lo harías de una manera más eficiente de cara a la BD. Hacer el formulario sería más sencillo y dinámico porque podrías sacar las opciones de la BD y mostrarlas en un bucle. Y para mostrar las respuestas cambiaría en que ahora recoges un registro y recorres sus campos en un bucle, y con esta solución recorrerías los registros en un bucle.

Saludos.

Restless Souls Online: se viene un gran MMORPG

Re: Tabla larga?

Avatar de jurena
* * * * * * *

(Nivel 7 - 1645 posts)

#3 Offline jurena Moderador 09 feb 10
Eloy8857,

me parece muy interesante tu sugerencia (yo nunca he usado nada parecido), y me atrevo a pedirte que, si puedes y tienes tiempo, nos pongas un ejemplo simple de un formulario con dos o tres preguntas y sus opciones gestionado de esta manera. Describe las tablas y el proceso, por favor.

Gracias

Re: Tabla larga?

Avatar de RanuTo
* * * * * * *

(Nivel 2 - 48 posts)

#4 Offline RanuTo Usuario 09 feb 10
gracias por las respuestas, creo q la mejor forma de hacerlo es como dice Eloy8857 teniendo dos tablas, una donde esten todas las opciones que tickee el usuario y otro donde relacione el usuario y las opciones tikeadas.
Gracias!

Re: Tabla larga?

Avatar de Eloy8857
* * * * * * *

(Nivel 4 - 449 posts)

#5 Offline Eloy8857 Usuario 09 feb 10
Claro jurena. Se puede tener por ejemplo la tabla opciones:


CREATE TABLE opciones(
op_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(20) NOT NULL DEFAULT '')ENGINE = InnoDB;



Y la tabla opciones_usuario:


CREATE TABLE opciones_usuario(
user_id INT NOT NULL,
op_id INT NOT NULL,
valor VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY(user_id, op_id),
CONSTRAINT FOREIGN KEY user_id REFERENCES usuarios(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FOREIGN KEY op_id REFERENCES opciones(op_id) ON DELETE CASCADE ON UPDATE CASCADE
)ENGINE = InnoDB;



Se puede hacer el formulario de manera dinámica. Un ejemplo con HTML y PHP embebido:


<?php
//Despues de conectar con la BD, validar al usuario, mostrar las cabeceras...
if (($res mysql_query('SELECT * FROM opciones'))){
    if (
mysql_num_rows($res) > 0){
?>
<form method="post" action="respuesta.php">
<ul style="list-style-type:none;">
<?php

        
while (($row mysql_fetch_row($res))){
?>
    <li><input type="checkbox" name="opcion[]" value="<php echo $row[0];?>" /><?php echo $row[1];?></li>
<?php
        
}

?>
    <li><input type="submit" value="Responder" /></li>
</ul>
</form>
<?php
        mysql_free_result
($res);
    }
    else
        echo 
'No hay opciones';
}
else
    echo 
'Error al consultar las opciones';

//Resto de la página
?>



Y en el action del form se podría tener:


<?php
//Despues de conectar con la BD, validar al usuario y lo que sea
//Se comprueba que se haya recibido el formulario como se esperaba
if (!empty($_POST['opcion']) && is_array($_POST['opcion'])){

    
//Función para aplicar un mysql_real_escape_string sobre las opciones
    
function escapar_opciones(&$value$key){
        
$value mysql_real_escape_string($value);
    }

    
//Aplicamos el escape a las opciones recibidas
    
array_walk($_POST['opcion'], 'escapar_opciones');

    
$qry "INSERT INTO opciones_usuario VALUES($_SESSION[user_id], '";
    
$qry .= implode("', 'true'), ($_SESSION[user_id], '"$_POST['opcion']);
    
$qry .= "', 'true')";
    
//Ahora en $qry tenemos:
    //INSERT ... VALUES (user_id, 'op_id', 'true'), (user_id, 'op_id', 'true')...
    
if (mysql_query($qry)){
        echo 
'Opciones insertadas OK';
    }
    else
        echo 
'Error en el INSERT de opciones';
}
//Resto de código
?>



Saludos.

Edit: edito para arreglar el INSERT :P

Restless Souls Online: se viene un gran MMORPG

Re: Tabla larga?

Avatar de jurena
* * * * * * *

(Nivel 7 - 1645 posts)

#6 Offline jurena Moderador 09 feb 10
Gracias, Eloy8857, gracias, maestro.

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

php-hispano.net 2002 - 2010 | XHTML 1.0
Datos Legales | Webmaster