Foros del Web » Programando para Internet » PHP »

LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL

Estas en el tema de LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL en el foro de PHP en Foros del Web. Hola a todos: Explicare lo mejor posible (Ya he buscado bastante en los foros antes de preguntar.... y no encontre lo que necesitaba) Lo que ...
  #1 (permalink)  
Antiguo 14/12/2007, 09:54
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
Pregunta LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL

Hola a todos: Explicare lo mejor posible
(Ya he buscado bastante en los foros antes de preguntar.... y no encontre lo que necesitaba)

Lo que pretendo hacer es algo parecido a las Paginas Amarillas, un cliente o empresa puede comprar una publicidad en una Categoria principal, pero dependiendo del plan elegido podria aparecer en otras Categorias.

Otro ejempo es el de www.masterfile.com, tambien una fotografia puede aparecer en varias categorias.
Joomla hace algo parecido, en el administrador de modulos uno elije en que categorias aparecera dicho modulo o si aparecera en todas.
En www.templatesmonster.com igual, una plantilla califica para aparecer en varias categorias.

Mi pregunta es como lograr esto almacenando los valores en la DB y obiamente tener una pagina donde se ejecute la consulta SQL y mostrar los registros que concuerden con dicha categoria.

La logica que tenia pensado para esto es: una tabla con la lista de categorias, y otra con la lista de fotos
categorias
id_cat
cat_name

Fotos
id_foto
id_cat (categoria principal)
id_cat_extra (o dejar un solo campo con la lista de categorias a la que pertenece la foto)
foto_nombre
etc....

Para almacenar los datos en la DB ulice una pequeña funcion que me guarda los campos separados por comas ej (2,6,10,14)
Código PHP:
function inCat($array){
    return 
implode(',',$array);

Nada impresionante pero funciona, lo que he podido lograr con SQL es que me busque los registros que concuerden con las categorias multiples.

Con la siguiente sentencia puedo buscar fotos de varias categorias y mostrarlas en una pagina
Código:
SELECT * FROM fotos WHERE c.id_cat IN (14,2,6)
Pero eso no es lo que quiero. Para buscar fotos que concuerden con una categoria intente los Siguente
Código:
SELECT * FROM fotos WHERE MATCH(id_cat) AGAINST('1 14 6');
no funciono porque esta sentencia busca palabras de mas de tres letras, por eso intente lo siguiente
Código:
SELECT * FROM fotos WHERE MATCH(id_cat) AGAINST('categoria1 categoria14 categoria6');
Funciono a medias porque no siempre me concordabvan los resultados.
Algunos podrian sugerir que en la tabla fotos agregue los campos de las categorias extra. Pero no me parece buena idea por que si se restringiria la cantidad de categorias extra disponibles. ej
Fotos
id_foto
id_cat
id_cat_ex1
id_cat_ex2
id_cat_ex3
id_cat_ex4
Si tengo 10,15,20 categorias solo podria elegir 4 extra, pero en algun momento alguna foto podria aplicar en varias categorias Ej: una Flor en la categoria flores, orquideas, ramos, cumpleaños, funerales etc.

Agradezco cualquier ayuda!
  #2 (permalink)  
Antiguo 14/12/2007, 10:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL

Hola ffjhon84, bienvenido al foro,

Lo que mas te conviene en este caso es usar relaciones múltiples, o relaciones m:n donde una categoría puede tener muchas fotos y una foto puede tener muchas categorías. Así podrás consultar todas las fotos de cierta categoría, o podrás consultar a que categorías pertenece una foto.

Para implementar esto necesitas 3 tablas, una tabla de categorías, otra tabla de fotos y la ultima que es la tabla de relaciones que generalmente solo tiene 3 campos: id, id_categoria, id_foto.

Es un poco engorroso implementar esto pero es lo mas adecuado para lo que necesitas.

Saludos.
  #3 (permalink)  
Antiguo 14/12/2007, 13:11
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL

Gracias GatorV
Tienes razon en la DB de Joomla encontre la tabla #__modules_menu donde se almacenas los valores del Listbox tal y como dijiste.

Pero aun asi solo tengo experiencia INSERTANDO EDITANDO y BORRANDO registros en una sola tabla. Ojala alguien pudiera darme un ejemplo de toda la metodogia a utilizar lo agradeceria.

En http://www.mysqlya.com.ar/index.php?inicio=63 hay algunos ejemplos
Tratare de solucionarlo yo mismo.

Gracias por la colaboracion
  #4 (permalink)  
Antiguo 14/12/2007, 18:46
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Re: LISTBOX: ¿guardar Selecciones Mult. en MySQL, despues buscar con SQL

¡Solucionado!

Lei un poco mas en el sitio dev.mysql.com y en el archivo admin.modules.php de Joomla y fui encontrando la solucion.

este es el codigo que hize para las pruebas y funciono perfectamente
Código PHP:
$action $_GET['action'];
$id_pic 10;
$categorias = array(2,5);
if(
$action == 'insert'){
    
$insert "INSERT INTO nn_pics (`name`) VALUES('MAGMA')";
    
mysql_query($insert$link);
    
$id_pic_r mysql_insert_id();
    if(
$id_pic_r){
        foreach(
$categorias as $id_cat){
            
$query "INSERT INTO nn_pics_cat SET id_pic={$id_pic_r}, id_cat={$id_cat}";
            
mysql_query($query$link);
        }
    }
}
if(
$action == 'update'){
    
$del "DELETE FROM nn_pics_cat WHERE id_pic={$id_pic}";
    
mysql_query($del$link);
    foreach(
$categorias as $id_cat){
        
$query "INSERT INTO nn_pics_cat SET id_pic={$id_pic}, id_cat={$id_cat}";
        
mysql_query($query$link);
    }

Con esta consulta puedo ver a que categorias pertenece una foto
Código:
SELECT * FROM nn_pics
INNER JOIN nn_pics_cat USING(id_pic)
INNER JOIN nn_cat USING(id_cat)
WHERE id_pic=10
Y con esta otra consulta puedo ver las fotos que concuerden con determinada categoria
Código:
SELECT * FROM nn_pics
INNER JOIN nn_pics_cat USING(id_pic)
INNER JOIN nn_cat USING(id_cat)
WHERE id_cat=3
Gracias por la ayuda!
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 23:38.